我在SQL中有一个查询设计如下:
Column A Column B Column C
Mary 24 First
Mary 25 Second
Paul 5 First
Tim 1 Second
我想用" First"返回所有行在C列中,以及" Second"只有它没有相应的" First"基于A栏的价值。所以我想看看:
Mary 24
Paul 5
Tim 1
我已经尝试了Case语句和If语句,但无法使其发挥作用。有什么建议吗?
答案 0 :(得分:8)
以下是使用ROW_NUMBER
SELECT * FROM
(
SELECT * , ROW_NUMBER()OVER(PARTITION BY [Column A] ORDER BY [Column C] ASC) RN
FROM TableName
) A
WHERE RN = 1
按字母顺序F
位于S
之前,因此行号1
将分配给First
。如果First
不存在,则1
将被分配到Second
答案 1 :(得分:0)
一个简单的答案是使用NOT IN。
所以,当C列= First OR C = Second时,这会占用所有人,而且他们没有其他的首次出现)
SELECT [Column A], [Column B]
FROM tableName
WHERE [Column C] = 'First'
OR
([Column C] = 'Second'
AND [Column A] NOT IN (
SELECT DISTINCT [Column A]
FROM tableName
WHERE [Column C] = 'First'))
我不确定它在速度方面是否有效,但它很容易理解。
我现在无法测试,所以如果我犯了错误,请发表评论。