【问题标题】:Average of 10 days in a month using sql server一个月平均10天使用sql server
【发布时间】:2015-03-03 06:16:47
【问题描述】:

在过去 2 年中,我每天都有一堆值。我需要得到每月 10 天的平均值。与 9 月 1 日至 9 月 10 日、9 月 11 日至 20 日等的平均值一样......

这些值在事实表中,我的目标是从中创建一个聚合事实表。事实表中的字段是 - Location Key、Time Key 和 Value。

time_dim 表有日历日期和time_key

有什么建议吗?

感谢您的帮助。

阿伦

样本数据

Location_Key----Time_Key----Value
2345------------414---------300
333-------------413---------400
1---------------2346--------566
14--------------1987--------900
2379------------111---------250
346-------------110---------1125
188-------------333---------567
187-------------422---------333
21--------------789---------170
211-------------2-----------900

Time dim 有日历日期,例如 2013.01.012013.01.022013.01.03..... 等。 我需要得到 10 天的平均值。

附上time_dim中的样本数据

TIME_KEY    CAL_DATE    DAY_OF_MONTH    WEEK_NUMBER MONTH_NUMBER    WEEK    DEKADE  DEKADE_NUMBER   MONTH   YEAR_MONTH  JULIAN  YEAR    DEKADE_KEY  MONTH_DESC
413 2013.01.01  1   1   1   2013W00 2013D01 1   Jan 2013M01 1   2013    2628    2013M01
103 2013.01.02  2   1   1   2013W00 2013D01 1   Jan 2013M01 2   2013    2628    2013M01
683 2013.01.03  3   1   1   2013W00 2013D01 1   Jan 2013M01 3   2013    2628    2013M01
414 2013.01.04  4   1   1   2013W00 2013D01 1   Jan 2013M01 4   2013    2628    2013M01
207 2013.01.05  5   1   1   2013W00 2013D01 1   Jan 2013M01 5   2013    2628    2013M01
684 2013.01.06  6   1   1   2013W00 2013D01 1   Jan 2013M01 6   2013    2628    2013M01
415 2013.01.07  7   2   1   2013W01 2013D01 1   Jan 2013M01 7   2013    2628    2013M01
6   2013.01.08  8   2   1   2013W01 2013D01 1   Jan 2013M01 8   2013    2628    2013M01
685 2013.01.09  9   2   1   2013W01 2013D01 1   Jan 2013M01 9   2013    2628    2013M01
416 2013.01.10  10  2   1   2013W01 2013D01 1   Jan 2013M01 10  2013    2628    2013M01
686 2013.01.11  11  2   1   2013W01 2013D02 2   Jan 2013M01 11  2013    2629    2013M01
208 2013.01.12  12  2   1   2013W01 2013D02 2   Jan 2013M01 12  2013    2629    2013M01
687 2013.01.13  13  2   1   2013W01 2013D02 2   Jan 2013M01 13  2013    2629    2013M01
417 2013.01.14  14  3   1   2013W02 2013D02 2   Jan 2013M01 14  2013    2629    2013M01
104 2013.01.15  15  3   1   2013W02 2013D02 2   Jan 2013M01 15  2013    2629    2013M01

SQL 查询

select  min(cal_date), max(cal_date), sum(daily_weather), location_key, dekade_key
from 
(select t.*,(row_number() over (order by cal_date) -
              row_number() over (partition by daily_weather order by cal_date)
             ) as grpid
      from aggr_fact_testing t
     ) t
group by grpid, cal_date,location_key,dekade_key

【问题讨论】:

  • 一些ddl和样本数据怎么样?我可以考虑 5 或 6 种非常简单的可能性,但这取决于您的数据结构等...sqlfiddle.com 是一个很好的起点
  • 既然已经有了时间维度,就不能直接加入事实表,加入10天的范围吗?
  • 我尝试将 time_dim 加入事实表,但坚持如何动态计算每个月的 10 天。编辑了示例数据的问题。
  • JamesZ,你是怎么做到的。这正是我正在寻找的。对不起,我对 SQL 不太熟悉。
  • 2 月的最后一个范围是 8 天还是 9 天?而对于一月/三月/五月/七月/八月/十月/十二月,最后一个范围是 11 天?

标签: sql sql-server


【解决方案1】:

诸如...之类的东西呢

SELECT t.Location_Key, td.MONTH_NUMBER, td.YEAR, CASE WHEN (td.DAY_OF_MONTH <= 10) THEN '1-10' ELSE CASE WHEN (td.DAY_OF_MONTH <= 20) THEN '11-20' ELSE '21-31' END END, AVG(t.Value) 
FROM yourTable t
INNER JOIN time_dim td ON td.TIME_KEY = t.Time_key
GROUP BY t.Location_Key, td.MONTH_NUMBER, td.YEAR, CASE WHEN (td.DAY_OF_MONTH <= 10) THEN '1-10' ELSE CASE WHEN (td.DAY_OF_MONTH <= 20) THEN '11-20' ELSE '21-31' END END

尚未对其进行测试,因为我不确定这是否正是您要寻找的。查看并发表评论。

【讨论】:

  • 谢谢@Pinx0。这行得通,不过我可能需要稍微调整一下。
猜你喜欢
  • 2014-02-22
  • 2016-10-02
  • 2013-10-14
  • 1970-01-01
  • 2017-03-25
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多