我有这张桌子:
CREATE TABLE SETTINGS
([AccountNumber] int, [KeyID] int, [KeyValue] varchar(50))
;
INSERT INTO SETTINGS
([AccountNumber], [KeyID], [KeyValue])
VALUES
(null, 1, 'welcome'),
(null, 2, 'defaultaccount'),
(null, 3, 'greetings'),
(1234567, 2,'customaccount');
;
我要完成的是返回具有唯一KeyID
的行。在某些情况下,我会出现两次相同的KeyID
,但对于一行,AccountNumber
不会为空。在这种情况下,我想返回AccountNumber
不为空的行。
我正试图获得输出:
为了获得输出,我为每条记录创建了rownumber
,然后尝试加入rownumber=1
的表格。但我不知道如何排除KeyID
匹配但AccountNumber is null
匹配的行。
这是我的代码。
;WITH singleRow AS (
SELECT * , ROW_NUMBER() OVER (PARTITION BY KEYID ORDER BY KEYID) as rownum
FROM SETTINGS);
SELECT s.KeyID FROM SETTINGS s
JOIN singleRow r
ON s.keyid = r.keyid
AND r.rownum = 1
在这种情况下我应该使用两个临时表吗?在第一个临时表中存储具有唯一KeyID
的所有行,其中AccountNumber is null
。在第二个商店中只有AccountNumber is not null
行。然后加入桌子?似乎我过于复杂了。
这是SQL FIDDLE。
答案 0 :(得分:2)
<强> SqlFiddleDemo 强>
;WITH singleRows AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY keyid ORDER BY AccountNumber DESC)
AS rownum
FROM settings
)
SELECT [AccountNumber], [KeyID], [KeyValue]
FROM singleRows
WHERE rownum = 1;