工作日聚合的星期函数

Posted

技术标签:

【中文标题】工作日聚合的星期函数【英文标题】:day of week function for week day aggregates 【发布时间】:2019-08-30 15:59:49 【问题描述】:

我目前有一个从表中读取并根据类别进行聚合的查询。它给了我我需要的东西,但我正在尝试添加另一列,查看过去一周中该类别/员工组合的所有记录。因此,如果使用此查询的作业在周三晚上运行,则需要获取周一和周二晚上的所有类别/员工记录的总数。

查询:

SELECT employee,
    sum(case when category = 'Shoes' and  date_of_report >=  current_date - 1 days then daily_total else 0 end) as Shoes_DAILY,
    sum(case when category = 'Shoes' and date_of_report >= ( current date - ( dayofweek(current date) - 1 ) days ) then sum(daily_total) else 0 end) as dailyTotalWeek
from shoeTotals
where date_of_report >= current_date
group by employee;

所以第三列有什么让我搞砸了,说函数使用无效。这就是我想要的:

源表有这些过去一周的记录:

employee   |   daily_total   |   date_of_report
--------------------------------------------------
123             14                  2019-08-26
123             1                   2019-08-27
123             56                  2019-08-28
123             6                   2019-08-29
123             8                   2019-08-30   * today

我想要的输出将获得(基于员工和类别)今天的总数 (8),然后是该类别在每个前一个工作日的所有员工记录的总和。如上所示,在星期一晚上运行只会计算当天的记录,星期五晚上会计算星期一到星期五的记录。

employee   |   shoes_daily   |    dailyTotalWeek 
--------------------------------------------------
123                 8                85         

我在使用 dayofweek 函数时做错了什么?

【问题讨论】:

我会查看分析/窗口函数,以按一年中的一周对您的列分区求和。然后只报告一年中的当前一周。 但这每晚运行,所以每天晚上我都会从今天的显式记录中获取每日数据,但我只希望第二列将运行前那一周的几天的值相加日期。有没有办法用 dayofweek 功能做到这一点 或者你对分析函数有什么建议吗? 【参考方案1】:

您不能嵌套聚合函数。我想你只是想要:

select employee,
       sum(case when category = 'Shoes' and date_of_report >=  current_date - 1 days
                then daily_total else 0
           end) as Shoes_DAILY,
       sum(case when category = 'Shoes' and date_of_report >= ( current date - ( dayofweek(current date) - 1 ) days )
                then daily_total else 0
           end) as dailyTotalWeek
from shoeTotals
where date_of_report >= current date - ( dayofweek(current date) - 1 ) days
group by employee;

【讨论】:

好的,这是有道理的,但该列的记录似乎太多了。每个员工的表中还有其他类别,即使使用类别子句,它似乎也得到了所有人的总数 问题似乎与您的原始查询有关。对于“今天”,即使您的 WHERE 子句显示为“date_of_report >= current_date”,您也可以使用条件“current_date - 1 天”(为什么是两天?)求和。在 Gordon Linoff 的回答中,这种差异只会变得很明显......

以上是关于工作日聚合的星期函数的主要内容,如果未能解决你的问题,请参考以下文章

Python生成连续星期序列

070:Django数据库ORM聚合函数详解-准备工作

由于某些原因,聚合函数在连接中无法正常工作

SAS中的星期几功能

按每周一分组数据未按预期工作

ElasticSearch 聚合函数