ROW_NUMBER 和 PARTITION 查询返回所有排名为 1 的行

Posted

技术标签:

【中文标题】ROW_NUMBER 和 PARTITION 查询返回所有排名为 1 的行【英文标题】:ROW_NUMBER and PARTITION query returning all rows ranked as 1 【发布时间】:2012-02-02 00:52:49 【问题描述】:

我的查询有问题,我希望它根据上次记录更改的时间对结果进行排名。

SELECT
  ROW_NUMBER() OVER (PARTITION BY ph.pricingHistoryId ORDER BY ph.changeRecorded DESC),
  ph.*
FROM
  PriceHistory ph

返回全1表示排名。

【问题讨论】:

ph.pricingHistoryId 是唯一的吗?行号应用于每个分区并为下一个分区重置。 是的,它是唯一的——表的主键 然后你需要对你想要编号的组进行分区。如果是整个集合,则删除整个“PARTITION BY ph.pricingHistoryId”部分。 @Akhil 谢谢 - 在我正在查看的示例中一定遗漏了一些东西。将其作为答案,我将标记为已接受。 你的意思是唯一键?如果它是主键,则所有分区都将返回结果为 1 【参考方案1】:

如果pricingHistoryId是主键,则通过它进行分区总是返回排名为1,因为不能有重复的主键!

【讨论】:

【参考方案2】:

行号应用于每个分区并为下一个分区重置。您需要对要编号的组进行“分区”。如果您希望对整个结果集使用一个序列,请完全删除“PARTITION BY ph.pricingHistoryId”,只保留“ORDER BY”部分。

【讨论】:

【参考方案3】:

同意@Akhil。这意味着 ph.pricingHistoryId 是唯一的。

【讨论】:

以上是关于ROW_NUMBER 和 PARTITION 查询返回所有排名为 1 的行的主要内容,如果未能解决你的问题,请参考以下文章

改进 row_number() 下的查询 over (partition by

使用 Row_number() OVER(partition BY..) 以及声明局部变量

PostgreSQL 窗口函数:row_number() over (partition col order by col2)

ROW_NUMBER(), PARTITION_BY, TOP 2 MAX If MAX 第一个和最后一个位置

SQL Server - 带有 PARTITION 的 ROW_NUMBER(),如何获取多条记录?

数据仓库系列 之SQL中row_number() over (partition by)的详解