2012-11-29 104 views
1

這是一個瘋狂的問題,但基本上我們需要標記與條件匹配的第一行,而不是其他的匹配,例如我們有一個所有用戶每天登錄的歷史記錄,但每個本月,我們想表明這是一個特定日期前登錄,例如:SQL Server 2008指示匹配的第一行,但不匹配

UserId  LoginDate 
1   2011-12-31 
2   2012-12-31 
1   2012-01-01 
2   2012-01-02 
1   2012-01-02 
2   2012-01-03 

等....

我們希望有一個SQL查詢將返回登錄即首先爲每個月結果集類似於:

UserId  LoginDate  WasFirstLoginOfMonth 
1   2011-12-31 0 
2   2012-12-31 0 
1   2012-01-01 1 
2   2012-01-02 1 
1   2012-01-02 0 
2   2012-01-03 0 

等....

我知道這似乎是一個瘋狂的要求,但我們需要知道哪些登錄滿足某一特定日期的條件,但只能有一個,其餘的則不能。

有沒有辦法做到這一點沒有一個緩慢的子選擇每行看看它是否是第一個?

非常感謝您的幫助。

+0

將傳遞給查詢的conidtion是什麼?是'哪月登錄日期',那麼查詢應該只獲得第一個包含該月中前兩個日期的行,並且像樣本數據中那樣忽略其餘行?或者是什麼?你能解釋更多嗎? –

回答

2

row_number()函數允許您對數據進行分區和排序。

因此,在此查詢中,rn代表用戶,年份和月份的登錄序號,因此當該值爲1時,即該月的第一次登錄。

select * 
from 
(
select *, 
     row_number() over 
     (
      partition by userID, 
      year(logindate), 
      month(logindate) 
      order by logindate 
     ) rn 
from yourtable 
) v 
where rn = 1 
+0

我帶着類似的東西去歡呼。 – user351711