使用 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的主要内容,如果未能解决你的问题,请参考以下文章