sql - 基于Order By SQL消除重复

标签 sql sql-server t-sql greatest-n-per-group

我有一个包含超过 20 列和超过 300.000 行的表格,其中与我的问题相关的列如下:

column1 |column2 |column3 | date
   123  |  657   | 2222   | 20 dec
   123  |  658   | 2222   | Null
   124  |  543   | 3333   | Null
   124  |  544   | 3333   | 1 Feb
   125  |  098   | 4444   | Null
   125  |  065   | 4444   | Null 

我执行了以下查询来根据需要对它们进行排序:

select * 
from table
order by column1,column2,date desc;

结果是:

column1 |column2 |column3 | date
   123  |  657   | 2222   | 20 dec
   123  |  658   | 2222   | Null
   124  |  544   | 3333   | 1 Feb
   124  |  543   | 3333   | Null
   125  |  065   | 4444   | Null
   125  |  098   | 4444   | Null 

主要目的是删除基于column1的重复行(如果它们的日期不为空)。如果它们都有 Null 那么我应该能够只保留一个。所以我正在寻找的是这样的:

column1 |column2 |column3 | date
   123  |  657   | 2222   | 20 dec
   124  |  544   | 3333   | 1 Feb
   125  |  065   | 4444   | Null

有人可以帮我开发这个查询吗?我希望检索所有其他列,而不仅仅是显示的列。

我使用的是 Azure SQL,它基本上是 SQL Server

我尝试这样做:

SELECT * FROM table AS main
WHERE main.column4 IN
(SELECT sub.MinID FROM
   (SELECT column1, column3, min(column4) As MinID
    FROM table
    GROUP BY column1, column3) AS sub)
ORDER BY main.column1, main.column3;

问题在于,由于规则是 min(column4),当我有一个 Not Nullcolumn4 值小于另一个选择NULL。我尝试输入 min(date) 但出现此错误: 将表达式转换为数据类型smalldatetime时发生算术溢出错误我猜测是因为Null值。

如何输入规则,如果一个为Not null,另一个为Null,则选择Not Null

最佳答案

看起来很经典top-n-per-group 。一种方法是使用 ROW_NUMBER :

WITH
CTE
AS
(
    SELECT
        column1
        ,column2
        ,column3
        ,dt
        ,ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY dt desc, column2) AS rn
    FROM tbl
)
SELECT
    column1
    ,column2
    ,column3
    ,dt
FROM CTE
WHERE rn = 1
ORDER BY
    column1
;

PARTITION BY column1表示当 column1 时重新开始行编号变化。 ORDER BY dt desc, column2确定对行进行编号时的顺序。最后,您只需使用 WHERE rn = 1 选择分区的第一行.

最终结果每个 column1 只有一行,因此在最终的 ORDER BY 中添加更多列不会改变任何东西。

关于sql - 基于Order By SQL消除重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41754725/

相关文章:

SQL 替换字符串中的多个不同字符

sql - 使用先前在同一 SQL 语句中定义的列短名称

mysql - 在 A 行上左连接多个 B 行时如何对 A 行列求和

sql - 根据值聚合对行进行分组

sql - 使用文件内容更新图像字段的最简单方法是什么

sql-server - T-SQL 触发器、非确定性错误、SQL Server

sql - 显示部分或完全缺少关联值的标题

sql - 如何: SQL Server select distinct field based on max value in other field

sql-server - 对等错误导致的连接重置

sql-server - 应用默认约束时出错