小编典典

在Postgres中选择每个用户的第N行

sql

我正在使用以下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;

但是每次表获得新行时,查询结果都会不同。
我想念什么吗?


阅读 222

收藏
2021-04-28

共1个答案

小编典典

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

经过一番评论:

认为 您需要:

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

请注意 PARTITION BY
。这样,您就跳过每一秒dateId每一个userId和附加(后下)行不改变选择为止。

另外,只要您为 _ 单个_ userIdWHERE "userId" = 789)选择行,就将谓词拉入子查询,即可达到相同的效果(单个用户的稳定选择)。两者都不需要。

WHERE子查询中的条款仅适用于单个用户,PARTITION BY在一个查询适用于任何数量的用户。

是吗 是吗?
他们应该为此给我“侦探”徽章。
严重地。

2021-04-28