当前位置: 首页 > 面试题库 >

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

翟俊远
2023-03-14
问题内容

我正在使用以下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
。这样,您就跳过每一秒dateId每一个userId和附加(后下)行不改变选择为止。

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

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

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



 类似资料:
  • 问题内容: 例如,是否可以选择一组元素中的每个第四个元素? 例如:我有16个元素…我可以写类似的东西。 有一个更好的方法吗? 问题答案: 顾名思义,它允许您使用除常数以外的变量构造算术表达式。您可以执行加法(),减法()和系数乘法(其中是整数,包括正数,负数和零)。 这是重写上面的选择器列表的方法: 有关这些算术表达式如何工作的解释,请参见我对该问题的回答以及规范。 请注意,此答案假设同一父元素内

  • 问题内容: 我在数据库中有一系列值需要提取以创建折线图。因为我不需要高分辨率,所以我想通过从数据库中选择第5行来对数据进行重新采样。 问题答案:

  • 问题内容: 我正在尝试使用By.cssSelector来捕获类c3的第n个dom元素,其结构如下: 测试我的CSS选择器时,我变得越来越困惑。此选择器正确选择c2 / c3的第二个实例: 而: 什么都不选。 更糟糕的是,将其转换为硒,我似乎始终没有为所有3个版本找到任何东西。有很多选择这些元素的替代方法(我可能只做XPATH),但是我对nth-of- type的缺乏了解使我发疯。谁能提供关于第二个

  • 问题内容: 我正在尝试使用By.cssSelector来捕获类c3的第n个dom元素,其结构如下: 测试我的CSS选择器时,我变得越来越困惑。此选择器正确选择c2 / c3的第二个实例: 而: 什么都不选。 更糟糕的是,将其翻译成selenium,我似乎始终没有为所有3个版本找到任何东西。有很多选择这些元素的替代方法(我可能只做XPATH),但是我对nth-of- type的缺乏了解使我发疯。谁能

  • 问题内容: 如标题所示,我想选择以分组的每组行的第一行GROUP BY。 具体来说,如果我有一个purchases看起来像这样的表: 我的输出: 我想查询每个人id最大的购买金额(total)customer。像这样的东西: Expected Output: 问题答案: 在PostgreSQL中,这通常更简单,更快捷(下面将进行更多性能优化): 或更短(如果不太清楚),输出列的序号为: 如果tot

  • 问题内容: 我正在努力寻找以下问题的最佳解决方案。假设我有一个像这样的表“ Table”: 我想为集合中的每个值选择:(’name1’,’name2’)10个随机唯一行。当然,可以像这样进行联合: 但是,如果我有100个唯一的名称,而我必须为其选择10个随机记录,则此查询将有点大。 提前非常感谢 问题答案: SQLFiddle演示