如何在不使用T-SQL中的行编号的情况下从表中删除多个重复行

时间:2016-12-06 19:49:37

标签: sql sql-server tsql

假设我有一张包含以下记录的表格:

| Participant_ID | VISITNUM | col1 | col2 | col3 |
|----------------|----------|------|------|------|
| 1              | 1        | ADA  | 3.2  | 1.7  |
| 1              | 2        | MJT  | 3.1  | 1.6  |
| 2              | 1        | LRM  | 4.1  | 2.2  |
| 2              | 1        |      | 4.1  | 2.2  |
| 2              | 2        | TPS  | 3.9  | 2.4  |
| 2              | 3        |      | 3.3  | 2.6  |
| 2              | 3        | MJT  | 3.3  | 2.6  |
| 2              | 4        | BLL  | 3.6  | 2.5  |
| 2              | 4        | BLL  | 3.6  | 2.5  |

您可以在上面看到,每个参与者(VISITNUM)都有多个“访问”记录(Participant_ID)。在某些情况下,某些参与者会有多次重复的“访问”。我无法使用SELECT DISTINCT,因为在某些情况下,记录在其中一个重复记录中可能有NULL值(请参阅col1空白)。

我在将窗口和/或CTE's应用于此情况时遇到问题,因为它只删除了第一个副本[Participant_ID],[VISITNUM],并且不会解决其他重复问题在[Participant_ID]的同一分区内。

我想要的输出是这样的:

| Participant_ID | VISITNUM | col1 | col2 | col3 |
|----------------|----------|------|------|------|
| 1              | 1        | ADA  | 3.2  | 1.7  |
| 1              | 2        | MJT  | 3.1  | 1.6  |
| 2              | 1        | LRM  | 4.1  | 2.2  |
| 2              | 2        | TPS  | 3.9  | 2.4  |
| 2              | 3        |      | 3.3  | 2.6  |
| 2              | 4        | BLL  | 3.6  | 2.5  |

...只返回唯一的[Participant_ID],[VISITNUM]记录并将重复项留空。我并不关心col1中的数据,它是否返回带有数据的重复记录或NULL。

非常感谢任何帮助或指示。

2 个答案:

答案 0 :(得分:1)

我不明白为什么你不能在这里使用ROW_NUMBER,你只需要PARTITION BY中的正确列:

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY Participant_ID, VisitNum ORDER BY VisitNum)
    FROM dbo.YourTable
)
SELECT  Participant_ID,
        VISITNUM,
        col1,
        col2,
        col3
FROM CTE
WHERE RN = 1;

答案 1 :(得分:0)

如果我理解正确,您可以使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by Participant_ID, VISITNUM
                                order by (select NULL)
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

您似乎希望每Participant_ID / VISITNUM对有一行,这就是它返回的内容。