2009-09-24 21 views
3

因此,我需要提取過去30天內未登錄到我的網站的成員的電子郵件地址。(SQL)從特定季度內某個特定季度內的大列表中提取特定數據

由於該網站已經過了幾年了,我們只想從每年的某些季度中只抽出幾名成員。

因此,例如,約有80萬人在過去30天內未登錄。

所以我們想從這個列表中抽取300,000個用戶,但是我們想在三年內將樣本分割。三年有十二個季度。 300,000/12 = 25,000。

所以我想從2007年第一季度

25,000 2007年第二季度

25,000 2007年第三季度

25,000 2007年第四季度

25,000 2008年第一季度

拉 25000 etc ....

我是否需要爲每個'quertar'編寫查詢然後將它們合併,或者有沒有辦法在一個查詢中完成所有的查詢?

SELECT Email, lastlogindate 
FROM Users 
WHERE DATEDIFF(dd, LastLoginDate, GetDate()) > 30 

這是基本的查詢我不得不把所有的數據。

我基本上要避免寫12個查詢WHERE子句,如:

DATEPART(q, LastLoginDate) = 1 AND 
DATEPART(yyyy, LastLoginDate) = 2007 

任何幫助,將不勝感激。

+0

+1,你打1K! – 2009-09-24 21:54:02

回答

5

嘗試這樣的事:

SELECT 
    Email,LastLoginDate 
    FROM (SELECT 
       Email,LastLoginDate 
        ,ROW_NUMBER() OVER(PARTITION BY DATEPART(year,LastLoginDate),DATEPART(quarter,LastLoginDate) ORDER BY LastLoginDate) AS Rank 
       FROM Users 
       WHERE LastLoginDate < GetDate()-30 
        AND LastLoginDate > GetDate()-(3*365) 
     ) dt 
    WHERE Rank<25000 

編輯
在派生表改變了WHERE更好的使用上LastLoginDate

的索引來檢查一切正常,你可以把這些加入到外部SELECT列表:

,DATEPART(year,lastchgdate) as Year,DATEPART(quarter,lastchgdate) AS Quarter,rank 

並添加ORDER BY

ORDER BY Year,Quarter,rank 
+0

投票:這就是我的意思,但懶得鍵入sql。 – AlexS 2009-09-24 20:47:11

+0

我喜歡這個該死的網站。萬分感謝! – 2009-09-24 21:36:41

+0

我實際上在編輯之前就使用了它。我想知道,爲什麼LastLoginDate> GetDate() - (3 * 365)與使用DATEPART(yyyy,LastLoginDate)<= 3 – 2009-09-24 21:38:36

1

您可以使用ranking function(s)來實現自己的目標:

  1. 計算「季號」每行(所以從你的時間跨度季度進行編號連續值)。
  2. 基於「季度數」值每行的
  3. 計算排名的組羣,你行
  4. 篩選記錄根據等級值

大功告成。