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 第一个和最后一个位置