(SQL)从特定日期属于特定季度的大列表中提取特定数据

Jac*_*tti 3 sql t-sql sql-server

因此,我需要提取过去30天内未登录我网站的会员的电子邮件地址.

由于该网站已有几年的历史,我们希望从一年中的某些季度中只抽取少数每个成员.

例如,有大约80万人在过去30天内没有登录.

因此,我们希望从该列表中提取300,000个用户,但我们希望将该样本拆分三年.三年有十二个季度.300,000/12 = 25,000.

所以我想从2007年第一季度开始增加25,000

2007年第二季度为25,000

从2007年第三季度开始的25,000

2007年第四季度为25,000

从2008年第一季度开始的25,000

等等....

我是否需要为每个'quertar'编写查询然后将它们联合起来?还是有办法在一个查询中执行所有操作?

SELECT Email, lastlogindate
FROM Users
WHERE DATEDIFF(dd, LastLoginDate, GetDate()) > 30 
Run Code Online (Sandbox Code Playgroud)

这是我必须提取所有数据的基本查询.

我基本上想避免用where子句写12个查询:

DATEPART(q, LastLoginDate) = 1 AND
DATEPART(yyyy, LastLoginDate) = 2007
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

KM.*_*KM. 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
Run Code Online (Sandbox Code Playgroud)

编辑
更改了WHERE派生表以更好地使用索引LastLoginDate

要检查一切是否正常,您可以将这些添加到外部SELECT列表:

,DATEPART(year,lastchgdate) as Year,DATEPART(quarter,lastchgdate) AS Quarter,rank
Run Code Online (Sandbox Code Playgroud)

并添加一个ORDER BY:

ORDER BY Year,Quarter,rank
Run Code Online (Sandbox Code Playgroud)