尝试使用带窗口函数的IF

时间:2017-03-06 18:29:14

标签: sql-server window-functions

我有一个如下所示的数据集:

    ID    Location      PrimaryLoc   Date            
    21     Tampa Beach    Y          2/23/16                 
    21     Miami beach    N          2/23/16            
    21     Hous           N          2/23/16
    375    LA             N          2/17/16
    375    SF             N          2/17/16
    375    SD             N          2/17/16

我需要拉回PrimaryLoc ='Y'的记录,或者,如果没有'Y',则拉回第一个'N'('N'并不重要。)

我在想一个Window Function可以在这里工作。我尝试了一个简单的方法,用1填充'Y',但如果ID没有'Y',我不知道如何获得'N'。也许一个IF类型语句可以工作,但我从来没有在SQL中这样做。

这是我到目前为止所做的:

select *, sum(case when PrimaryLoc = 'Y' then 1 else 0 end) over(partition by ID, Location order by date)rn
from table

2 个答案:

答案 0 :(得分:0)

嗯,你是对的,窗口功能是解决方案,但你的实现已经过时了。

我假设您只按ID进行分组,因为这是您的示例数据中唯一具有重复项的列。

这应该这样做:

WITH cte AS (
select *, ROW_NUMBER() OVER (partition by ID order by case when PrimaryLoc = 'Y' then 0 else 1 end, date) rn
from table
)
SELECT * FROM cte WHERE rn=1

答案 1 :(得分:0)

您可以使用窗口功能:

WITH CTE AS
(
    SELECT  *,
            RN = RANK() OVER(PARTITION BY ID ORDER BY PrimaryLoc DESC, [Date] DESC)
    FROM dbo.YourTable
)
SELECT *
FROM CTE
WHERE RN = 1;