我有一个包含超过 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 Null
且 column4
值小于另一个选择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/