代码之家  ›  专栏  ›  技术社区  ›  Jack Marchetti

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

  •  3
  • Jack Marchetti  · 技术社区  · 15 年前

    因此,我需要提取过去30天没有登录我的网站的成员的电子邮件地址。

    由于这个网站已经有几年的历史了,我们只想从一年中的某个季度抽取少数成员。

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

    所以我们想从这个列表中抽取300000个用户,但我们想在三年内将其分割为样本。三年有十二个季度。300000/12=25000。

    所以我想拉 自2007年第一季度起25000人

    从2007年第二季度起,25000人

    从2007年第3季度起,25000人

    2007年第4季度起25000人

    自2008年第一季度起,25000人

    等。。。。

    我需要为每个“quertar”编写查询,然后将它们联合起来,还是有一种方法可以在一个查询中完成所有操作?

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

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

    我基本上希望避免编写12个查询,其中包含以下WHERE子句:

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

    任何帮助都将不胜感激。

    2 回复  |  直到 15 年前
        1
  •  5
  •   KM.    15 年前

    尝试如下操作:

    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
    
        2
  •  1
  •   AlexS    15 年前

    你可以使用 ranking function(s) 要实现您的目标:

    1. 计算每一行的“季度数”(这样,从您的时间跨度算起的季度用连续值编号)。
    2. 根据“季度数”值对行进行分组
    3. 计算组中每行的排名
    4. 基于排名值筛选记录

    你完了。