我正在使用以下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。
("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和附加(后下)行不改变选择为止。
PARTITION BY
userId
另外,只要您为 _ 单个_ userId(WHERE "userId" = 789)选择行,就将谓词拉入子查询,即可达到相同的效果(单个用户的稳定选择)。两者都不需要。
WHERE "userId" = 789
该WHERE子查询中的条款仅适用于单个用户,PARTITION BY在一个查询适用于任何数量的用户。
WHERE
是吗 是吗? 他们应该为此给我“侦探”徽章。 严重地。