在Postgres中选择每个用户的第N条记录[英] Selecting every Nth row per user in Postgres

本文是小编为大家收集整理的关于在Postgres中选择每个用户的第N条记录的处理方法,想解了在Postgres中选择每个用户的第N条记录的问题怎么解决?在Postgres中选择每个用户的第N条记录问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在使用这个 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 (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.这样,您就可以为每个 userId 跳过每一秒 dateId,并且到目前为止,其他(稍后)行不会更改选择.

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

子查询中的 WHERE 子句仅对单个用户有效,PARTITION BY 在一个查询中适用于任意数量的用户.

是这样吗?是吗?
他们应该为此给我"侦探"徽章.
说真的.

本文地址:https://www.itbaoku.cn/post/1764070.html