我具有以下数据库架构
ID creation_date
1 2019-06-03
2 2019-06-04
3 2019-06-04
4 2019-06-10
5 2019-06-11
我需要按周找出表组的总大小。我正在寻找的输出类似于
year week number_of_records
2019 23 3
2019 24 5
我正在编写以下查询,该查询只给我每周创建的记录数
> select year(creation_date) as year, weekofyear(creation_date) as week,
> count(id) from input group by year, week;
我得到的输出是
year week number_of_records
2019 23 3
2019 24 2
答案 0 :(得分:0)
对于8.0之前的版本...
模式(MySQL v5.7)
CREATE TABLE my_table
(ID SERIAL PRIMARY KEY
,creation_date DATE NOT NULL
);
INSERT INTO my_table VALUES
(1 , '2019-06-03'),
(2 , '2019-06-04'),
(3 , '2019-06-04'),
(4 ,'2019-06-10'),
(5 ,'2019-06-11');
查询#1
SELECT a.yearweek
, @i:=@i+a.total running
FROM
(SELECT DATE_FORMAT(x.creation_date,'%x-%v') yearweek
, COUNT(*) total
FROM my_table x
GROUP BY yearweek
)a
JOIN (SELECT @i:=0) vars
ORDER BY a.yearweek;
| yearweek | running |
| -------- | ------- |
| 2019-23 | 3 |
| 2019-24 | 5 |
---
答案 1 :(得分:0)
看看窗口(或分析)功能。
与聚合函数不同,窗口函数保留结果行并简化与之相关的操作。在order by
子句中使用over
时,窗口将根据指定的顺序从第一行到当前行完成,这正是您所需要的。
select year, week, sum(number_of_records) over (order by year, week)
from (
select year(creation_date) as year, weekofyear(creation_date) as week,
count(id) as number_of_records
from input group by year, week
) your_sql
我想您还需要每年重新设置金额,我将留作练习用(提示:partition
子句)。
答案 2 :(得分:0)
您似乎想要一个累加的总和。您可以使用窗口函数直接在聚合查询中执行此操作:
select year(creation_date) as year, weekofyear(creation_date) as week,
count(*) as number_of_starts,
sum(count(*)) over (order by min(creation_date)) as number_of_records
from input
group by year, week;