按周分组的记录总数

时间:2019-07-23 02:13:51

标签: mysql sql postgresql group-by aggregate

我具有以下数据库架构

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

3 个答案:

答案 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       |

---

View on DB Fiddle

答案 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;