gpt4 book ai didi

sql - 在 Postgres 中为每个用户选择每第 N 行

转载 作者:行者123 更新时间:2023-11-29 11:57:42 25 4
gpt4 key购买 nike

我正在使用这个 SQL 语句:

SELECT "dateId", "userId", "Salary" 
FROM (
SELECT *,
(row_number() OVER (ORDER BY "userId", "dateId"))%2 AS rn
FROM user_table
) sa
WHERE sa.rn=1
AND "userId" = 789
AND "Salary" > 0;

但是每次表获取新行时查询的结果都不一样。
我错过了什么吗?

最佳答案

假设 ("dateId", "userId") 是唯一的并且新行总是有一个更大的(后来的)dateId

经过一些评论:

认为您需要的:

SELECT "dateId", "userId", "Salary"
FROM (
SELECT "dateId", "userId", "Salary"
,(row_number() OVER (<b>PARTITION BY "userId"</b> -- either this
ORDER BY "dateId")) % 2 AS rn
FROM user_table
<b>WHERE "userId" = 789</b> -- ... or that
) sub
WHERE sub.rn = 1
AND "Salary" > 0;

注意 PARTITION BY .通过这种方式,您可以跳过每个 userId 的每一秒 dateId,并且到目前为止,其他(后面的)行不会更改选择。

此外,只要您为单个 userId 选择行(WHERE "userId"= 789), 将谓词拉入子查询,达到同样的效果(单用户稳定选择)。您不需要两者。

子查询中的 WHERE 子句仅适用于单个用户,PARTITION BY 适用于一个查询中任意数量的用户。

是吗?是吗?
他们应该为此给我“侦探”徽章。
认真的。

关于sql - 在 Postgres 中为每个用户选择每第 N 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7518788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com