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)
任何帮助将不胜感激.
尝试这样的事情:
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)
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |