我试图构造一个查询,只返回与给定ID和SUB-ID相关的记录。如果条件不满足,我想返回第二种可能性,即第二个组合ID,Sub-ID。注意:数据有数千个ID,但每个ID只有2个子ID。
这是一个输入记录的例子:
ID | Sub-id | VALUE
------------------------------
1 | 1 | "T"
------------------------------
1 | 1 | "F"
------------------------------
1 | 2 | "Z"
------------------------------
1 | 2 | "G"
所需输出为:
ID | Sub-id | VALUE
------------------------------
1 | 1 | "T"
------------------------------
1 | 1 | "F"
------------------------------
如果我们只有与给定ID的第二个组合相关的记录,那么输出应该是:
ID | Sub-id | VALUE
------------------------------
1 | 2 | "Z"
------------------------------
1 | 2 | "G"
我试图通过一个CTE表达式来实现这一点,但没有成功。考虑到我的情况,这种方法只返回了一张唱片。
我的尝试:
WITH CTE (ID,SUB-ID,DuplicateCount,VALUE) AS (
SELECT
ID,
Sub-id,
ROW_NUMBER () OVER (PARTITION BY ID
ORDER BY SUB-ID) as DUPLICATECOUNT,
VALUE
FROM TBL_SOURCE
我错过了什么?
如果我没有错,你想要rank()
而不是row_number()
:
select *
from (
select t.*, rank() over(partition by id order by subid) rn
from mytable t
) t
where rn = 1
rank()
为具有相同id
和subid
的记录分配相同的编号,而row_number()
则保证了序列的唯一性。
如果您只想将其用于给定的id,则可以使用top with ties
:
select top (1) with ties t.*
from t
where id = 1
order by subid;