我正在编写一个查询,我需要根据以下条件选择记录: 如果PrimaryLocation ='Y',则选择该记录。如果PrimaryLocation ='N'且locationstate = issuestate,则选择具有匹配状态的第一个记录。如果PrimaryLocation ='N'且issstate为NULL,则选择第一个记录为非NULL。如果PrimaryLocation ='N'且所有发布状态均为NULL,则选择任何记录。
数据集如下所示:
ID licensenumber IssuingState LocationName PrimaryLocation LocationState
10 555 FL Coral Y FL
10 555 GA Seaside N FL
20 777 FL Jax N FL
20 777 FL Broward N FL
30 999 FL Broward N GA
30 999 FL Davie N FL
40 888 NULL Orange N FL
40 888 FL Davie N FL
50 333 NULL Dade N FL
50 333 NULL Orange N FL
对于ID = 10,我只想要第一条记录,其中PrimaryLocation ='Y'。
对于ID = 20,我想要任何一条记录。
对于ID = 30,我希望LocationName ='Davie'的记录,因为LocationState = IssuingState
对于ID = 40,我希望LocationName ='Davie',因为Issuing State不是NULL。
对于ID = 50,我可以选择任一记录。
此数据集是我正在使用#temp表的较大查询的一部分。我一直在使用带有Row_Number()的Window Functions,但是我对查询的LocationState = IssuingState部分有特别的困难。
到目前为止,这是我能够提出的所有内容:
SELECT id, licensenumber, issuingstate, locationname, primarylocation, locationstate,
DENSE_RANK()OVER(PARTITION BY id, licensenumber, issuingstate
ORDER BY primarylocation DESC)
INTO #LICENSES
FROM TABLE
SELECT *, ROW_NUMBER()OVER(PARTITION BY id, licensenumber, licensetypename, issuingstate,
ORDER BY PRIMARYLOCATION DESC) RN
FROM #LICENSES
答案 0 :(得分:3)
您可以在order by
窗口函数中优先考虑row_number
中提到的条件。
select * from (
select t.*,row_number() over(partition by id order by
case when PrimaryLocation ='Y' then 1
when PrimaryLocation ='N' and locationstate = issuingstate then 2
when PrimaryLocation ='N' and issuingstate is NULL then 3
else 4 end, locationName) as rnum
from tbl t
) t
where rnum = 1
答案 1 :(得分:0)
编写查询的另一种方法是:
{{1}}