SQL窗口函数选择一条记录与另一条记录

时间:2017-09-19 20:55:24

标签: sql sql-server tsql

我正在编写一个查询,我需要根据以下条件选择记录:  如果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

2 个答案:

答案 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}}