我有一个如下所示的数据集:
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
答案 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;