【问题标题】:How to write query for Dynamic Date period slab / Grouped in MS SQL?如何在 MS SQL 中编写动态日期周期板/分组查询?
【发布时间】:2018-10-16 12:58:06
【问题描述】:

我想创建一个报告,在该报告中我需要根据 13 天的记录显示聚合函数。

1. 2018-10-01  to 2018-10-13       17 count 
2. 2018-10-14  to 2018-10-26       9  count 
3. 2018-10-26  to 2018-11-09       65 count
......

需要对任何特定日期范围(例如 2018 年到 2019 年)进行动态查询,其中包含任意天/月/年的平板,例如在提供的范围内的 17 天期间平板。

【问题讨论】:

  • 您能否提供一些关于如何根据 X 天的时间段计算块的开始/结束日期的逻辑?是否像最早的日期是原点和周期从那里开始一样简单?
  • 。假设有学生的每日出勤记录……我想查看 5 天平板的出勤率。表 hav cols 是 >>> [date], [attendance_count] qerry 输出应该是这样的 ... startdate = '2018-06-01' ;周期 = 5; -- 持续时间为 5 天的平板 enddate = '2018-06-25'; 2018 年 6 月 2 日至 6 月 7 日 71 2018 年 6 月 8 日至 2018 年 6 月 11 日 54 2018 年 6 月 12 日至 2018 年 6 月 18 日 77 2018 年 6 月 19 日至 2018 年 6 月 24 日 67

标签: sql sql-server aggregate


【解决方案1】:

如果我理解正确,您可以在聚合中包含日期算术:

select dateadd(day, datediff(day, @startdate, min(date)) / @period, @startdate) as period_start,
       dateadd(day, @period - 1 + datediff(day, @startdate, min(date)) / @period, @startdate) as period_end,
       count(*)
from t
where date >= @startdate and date < @enddate
group by datediff(day, @startdate, date) / @period;

在 SQL Server 中,我认为 apply 使这更容易理解:

select dateadd(day, periodnum * period, @startdate) as period_start,
       dateadd(day, periodnum * (period + 1) - 1, @startdate) as period_end,
       count(*)
from t cross apply
     (values (datediff(day, @startdate, date) / @period)
     ) v(periodnum)
where date >= @startdate and date < @enddate
group by periodnum;

【讨论】:

  • 你几乎明白我的意思了,但你提供的解决方案在我的情况下没有奏效。假设有学生的每日出勤记录......我想查看 5 天平板的平均出勤率。表 hav cols 是 >>> [date], [attendance_count] qerry 输出应该是这样的 ... startdate = '2018-06-01' ;周期 = 5; -- 持续时间为 5 天的平板 enddate = '2018-06-25'; 2018 年 6 月 2 日至 6 月 7 日 71 2018 年 6 月 8 日至 2018 年 6 月 11 日 54 2018 年 6 月 12 日至 2018 年 6 月 18 日 77 2018 年 6 月 19 日至 2018 年 6 月 24 日 67
  • @NabeelArif 。 . .这个问题是关于计数而不是平均值。如果您对平均值有疑问,请提出另一个问题,并附上适当的样本数据、期望的结果和解释。
  • 对不起,这是动态期间平板的出勤人数
猜你喜欢
  • 2019-12-04
  • 2023-03-18
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2017-10-15
  • 1970-01-01
相关资源
最近更新 更多