假设我有一张包含以下记录的表格:
| 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。
非常感谢任何帮助或指示。
答案 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
对有一行,这就是它返回的内容。