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

Tim*_*mka 2 sql postgresql select row-number window-functions

我正在使用这个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;
Run Code Online (Sandbox Code Playgroud)

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

Erw*_*ter 5

假设这("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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

是吗?是吗?
他们应该为此给我"侦探"徽章.
认真.