【问题标题】:SQL aggregate for a Week or Year一周或一年的 SQL 聚合
【发布时间】:2020-06-18 23:07:32
【问题描述】:

我有一个类似的 SQL 查询,

select  
    DATEPART (week, pos_date) as weeknr,
      Sum(redeem_count)* 100.0/Sum(issue_count) as incent_redemption_rate,
      pos_date
from incent_summary
group by pos_date
order by pos_date

我得到如下输出

weeknr  incent_redemption_rate  pos_date
20  13.356164383561 2020-05-10 00:00:00.000
20  8.990536277602  2020-05-11 00:00:00.000
20  9.615384615384  2020-05-12 00:00:00.000
20  12.917271407837 2020-05-13 00:00:00.000
20  11.447811447811 2020-05-14 00:00:00.000
20  13.773314203730 2020-05-15 00:00:00.000
20  10.798650168728 2020-05-16 00:00:00.000
21  9.164420485175  2020-05-17 00:00:00.000
21  12.170087976539 2020-05-18 00:00:00.000
21  12.000000000000 2020-05-19 00:00:00.000
21  12.932330827067 2020-05-20 00:00:00.000
21  13.464447806354 2020-05-21 00:00:00.000
21  11.248073959938 2020-05-22 00:00:00.000
21  13.868613138686 2020-05-23 00:00:00.000
22  16.559485530546 2020-05-24 00:00:00.000
22  12.602739726027 2020-05-25 00:00:00.000
22  11.559888579387 2020-05-26 00:00:00.000
22  11.176470588235 2020-05-27 00:00:00.000

我实际上打算按周聚合incent_redemption_rate,所以我只需要第 20 周的 1 条记录,而不是多条记录,实际上是第 20 周的开始日期。

【问题讨论】:

  • 然后,按周分组,而不是按日期分组。

标签: sql-server date datetime


【解决方案1】:

我认为您需要每周的起始率,然后显示一周的开始日期,即星期一。一种方法是获取每周的每周启动率,如下所示,然后将其与主表连接以获取 pos 日期。

SELECT pos_date,wkly_rate.weeknr, wkly_rate.incent_redemption_rate
FROM incent_summary ins
JOIN (SELECT DATEPART(week, pos_date) as weeknr,
         SUM(redeem_count)* 100.0/Sum(issue_count) as incent_redemption_rate
      FROM incent_summary
      GROUP BY DATEPART(week, pos_date) ) wkly_rate ON wkly_rate.weeknr = DATEPART(week, ins.pos_date)
WHERE DATENAME(WEEKDAY,A.pos_date) = 'Monday'

但是,您在查询中所做的是获得每天而不是每周的起始率,然后您可以使用以下查询获得一天,即星期一。

SELECT * 
FROM (SELECT 
        DATEPART(week, pos_date) as weeknr,
        SUM(redeem_count)* 100.0/Sum(issue_count) as incent_redemption_rate,
        pos_date
      FROM incent_summary
      GROUP BY pos_date
 ) A
 WHERE DATENAME(WEEKDAY,A.pos_date) = 'Monday'
 ORDER BY pos_date

【讨论】:

    【解决方案2】:

    要每周获取数据,只需将查询更改为按weeknr 分组(使用其公式,因为您不能按列别名分组)并取pos_dateMIN 以获得第一个星期几:

    SELECT
          DATEPART (week, pos_date) as weeknr,
          SUM(redeem_count)* 100.0/SUM(issue_count) AS incent_redemption_rate,
          MIN(pos_date)
    FROM incent_summary
    GROUP BY DATEPART (week, pos_date)
    ORDER BY DATEPART (week, pos_date)
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2019-08-02
      • 2022-01-06
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多