2017-03-06 66 views
0

我有一個數據集,看起來像這樣:嘗試使用IF與窗函數

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'並不重要)。

我在想一個窗口函數會在這裏工作。我嘗試了一個簡單的方法,用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

嗯,你說得對,窗函數是解決方案,但你的實現是路要走。

我假設您僅由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 
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; 
+1

使用RANK()是,它會返回每個ID多的結果,如果出現平局的問題在ORDER BY中。我的理解是,OP只需要每個ID的一個結果,並且如果有一個平局,那麼返回哪一個並不重要。 –

+0

@TabAlleman是的,我選擇了它專門爲它,在多個'Y'的情況下,但它確實可能是錯誤的選擇,如果在同一天多個'N' – Lamak

+0

感謝您的幫助。 Row_Number()工作。如果沒有「Y」,Rank()將所有記錄帶回='N'。令人沮喪的是,答案確實比我想要做的更簡單。但我想我仍然處於窗口函數的學習階段。 – jackstraw22