26

我在 SQL 的 Partition By 语句中使用了多个列,但返回了重复的行。我只希望返回不同的行。

这是我在 Partition By 中编码的内容:

SELECT DATE, STATUS, TITLE, ROW_NUMBER() OVER (PARTITION BY DATE, STATUS, TITLE ORDER BY QUANTITY ASC) AS Row_Num
    FROM TABLE

这是我目前得到的输出:(返回重复行的地方 -请参阅第 6 至 8 行

在此处输入图像描述

这是我想要实现的输出:(不返回重复行 -请参阅第 6 至 8 行

在此处输入图像描述

问题:如何在1 个分区中放置多列并确保不返回重复行?

如果有人可以在这方面为我提供帮助,不胜感激,非常感谢!!

4

3 回答 3

23

试试这个,它对我有用

SELECT * FROM (
            SELECT
                [Code],
                [Name],
                [CategoryCode],
                [CreatedDate],
                [ModifiedDate],
                [CreatedBy],
                [ModifiedBy],
                [IsActive],
                ROW_NUMBER() OVER(PARTITION BY [Code],[Name],[CategoryCode] ORDER BY ID DESC) rownumber
            FROM MasterTable
          ) a
        WHERE rownumber = 1 
于 2018-04-13T07:03:21.797 回答
7

如果您的表列包含重复数据,并且如果您直接应用 row_number() 并在列上创建 PARTITION,则有可能导致重复行和行号值。

要删除重复行,您需要在 from 子句中再进行一个 INNER 查询,以消除重复行,然后它将输出给它最重要的外部 FROM 子句,您可以在其中应用 PARTITION 和 ROW_NUMBER ()。

如下例所示:

SELECT DATE, STATUS, TITLE, ROW_NUMBER() OVER (PARTITION BY DATE, STATUS, TITLE ORDER BY QUANTITY ASC) AS Row_Num
FROM (
     SELECT DISTINCT <column names>...
) AS tbl
于 2015-10-08T09:30:25.520 回答
2

我会创建一个 cte 并进行内部连接。效率不高但是很方便

with table as (
SELECT DATE, STATUS, TITLE, ROW_NUMBER() 
OVER (PARTITION BY DATE, STATUS,  TITLE ORDER BY QUANTITY ASC) AS Row_Num
 FROM TABLE)

select *

from table t
join select(
max(Row_Num) as Row_Num
,DATE
,STATUS
,TITLE
from table 
group by date, status, title) t2  
on t2.Row_Num = t.Row_Num and t2
and t2.date = t.date
and t2.title = t.title
于 2017-02-23T17:42:27.940 回答