使用 concat 按周分组 SQL

Posted

技术标签:

【中文标题】使用 concat 按周分组 SQL【英文标题】:SQL group by week with concat 【发布时间】:2019-08-02 15:30:16 【问题描述】:

我有一张这样的表(“table_1”)

Day         Product
2019-07-08  a
2019-07-02  b
2019-07-02  b
2019-07-01  a
2019-07-01  b
...

我需要这个:

Week                        a      b
2019-07-01 to 2019-07-08    2      4
2019-07-08 to 2019-07-15    23     5
...

所以,我试图从以下开始近似解决方案:

select 
   concat(Day,'to', Day + interval 6 day) AS week, 
   count(distinct Product) as Counts 
from table_1
group by week(date(Day))

但我收到此错误

"concat"(day, 'to', day + interval 6 day)' must be an aggregate expression or appear in GROUP BY clause

我正在使用 mysql 和元数据库

【问题讨论】:

考虑处理应用代码中数据显示的问题 (你确定你使用的是 MySQL) 【参考方案1】:

一个解决方案——如果你有所有天的数据——是:

select concat(min(Day),'to', min(Day) + interval 6 day) AS week, 
       count(distinct Product) as Counts 
from table_1
group by week(date(Day));

您可能还应该将年份考虑在内。

【讨论】:

我在尝试您的解决方案时收到此错误:不匹配的输入 '6' 期望 '.', ')', ',', '[', 'AND', 'AT', ' BETWEEN、'IN'、'IS'、'LIKE'、'NOT'、'OR'、'='、NEQ、''、'>='、'+' , '-', '*', '/', '%', '||' @劳拉。 . . MySQL 支持该语法。【参考方案2】:

使用日期中的 WEEK 编号的想法与 Gordon 的回答有点相同,以下脚本将给出您确切的预期输出。周计算基于从 SUNDAY 开始的 WEEK。

SELECT  
CONCAT(CAST(DATE_ADD(Day, INTERVAL(1-DAYOFWEEK(Day)) DAY) AS DATE),
    ' To ',
    CAST(DATE_ADD(Day, INTERVAL(1-DAYOFWEEK(Day))+6 DAY) AS DATE)) Week, 
COUNT(CASE WHEN Product = 'a' THEN 1 ELSE NULL END) as a,
COUNT(CASE WHEN Product = 'b' THEN 1 ELSE NULL END) as b
FROM table_1
GROUP BY 
CONCAT(CAST(DATE_ADD(Day, INTERVAL(1-DAYOFWEEK(Day)) DAY) AS DATE),
    ' To ',
    CAST(DATE_ADD(Day, INTERVAL(1-DAYOFWEEK(Day))+6 DAY) AS DATE))
,YEAR(Day);

【讨论】:

以上是关于使用 concat 按周分组 SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django ORM 按周分组

使用 Node js 按周/月/年对文档进行分组

如何在打字稿/离子2中按周分组时间戳?

按周分组和求和

如何使用 EF Core 按周 对数据分组?

按周/月/等和 ActiveRecord 分组?