【问题标题】:SQL Partition by clauseSQL 按子句分区
【发布时间】:2015-07-02 15:56:40
【问题描述】:

我在结果集的分区内的 sql 中使用 ROW_NUMBER 函数,我只想要每个分区中的第一行。这是查询:

Select A, B, C, ROW_NUM
FROM
(SELECT A,B,C, ROW_NUMBER() OVER (PARTITION BY A ORDER BY C DESC) AS R0W_NUM
FROM TABLE 
)X
WHERE ROW_NUM = 1

它产生了预期的结果。

但不是这个,现在我使用 FIRST_VALUE 函数如下:

SELECT A,B,C, FIRST_VALUE(C) OVER (PARTITION BY A ORDER BY C DESC) AS ROW_NUM
FROM TABLE

但是上面的查询也给了我重复的值。谁能指导我如何摆脱重复项?我尝试使用 DISTINCT,没有帮助。

【问题讨论】:

  • 您可以用FIRST_VALUE(<letter>) 替换所有A,B,C 并重复OVER() 子句以获得相同的结果集,但您为什么要这样做?如果ROW_NUMBER() 已经在做正确的工作,这里的实际动机是什么?或者,如果它没有做正确的工作,那么您实际上想在这里实现什么?
  • 请务必使用正确的方言标记 SQL 问题(tsql,我相信?)以便精通该方言的人可以提供帮助(因为 SQL 方言之间存在显着差异)。
  • SELECT DISTINCT怎么样?
  • @Amadan:是什么让你认为那是 T-SQL?示例显示实际上是标准的 ANSI SQL。但我同意这个问题应该用相关的 DBMS 标记
  • @a_horse_with_no_name:我承认这是瞎猜。

标签: sql sql-server-2014 window-functions


【解决方案1】:

在 C 上使用 FIRST_VALUE 不会删除 A 的重复项。

如果您想删除 A 的重复项,您可以使用以下查询之一,具体取决于 B 的角色。

如果B被认为是分区的一部分,类似于A

Select A, B, MAX(C)
FROM TABLE
GROUP BY A, B

如果 B 包含一个类似于 C 的可聚合值(最小值、最大值、总和...)

Select A, MAX(B), MAX(C)
FROM TABLE
GROUP BY A

如果 B 既不类似于 A(可能分区)或 C(可能聚合),那么我会保留您在问题中包含的 ROW_NUMBER() 解决方案。

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 2019-04-14
    • 2015-10-17
    • 2013-01-10
    • 2020-06-05
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多