MySQL分组的怪异行为
我在MySQL数据库中有一个这样的表:
CREATE TABLE metrics (
id int(11) NOT NULL AUTO_INCREMENT,
date date NOT NULL,
value int(11) NOT NULL,
PRIMARY KEY (id)
) ENGINE InnoDB AUTO_INCREMENT=1 CHARSET=utf8mb4;
具有以下值:
INSERT INTO metrics (date, value)
VALUES
('2022-04-01', 1),
('2022-04-02', 1),
('2022-04-03', 1),
('2022-04-04', 1),
('2022-04-05', 1),
('2022-04-06', 1),
('2022-04-07', 1),
('2022-04-08', 1),
('2022-04-09', 1),
('2022-04-10', 1),
('2022-04-11', 1),
('2022-04-12', 1),
('2022-04-13', 1),
('2022-04-14', 1);
我想通过几周将值分组的总和。 MySQL的默认一周是从星期一到周日,但是我需要在周日至周六之前按每周进行分组,因此这是我的查询:
SELECT
(DATE_SUB(date, INTERVAL WEEKDAY(date) DAY) - INTERVAL 86400000000 MICROSECOND) AS week_start,
SUM(value) AS value__sum
FROM
metrics
GROUP BY
(DATE_SUB(date, INTERVAL WEEKDAY(date) DAY) - INTERVAL 86400000000 MICROSECOND)
ORDER BY
week_start ASC;
Interval 86400000000 Microsecond
此间隔非常奇怪,因为Django Orm会这样做。无论如何,我得到了这样的结果:
week_start |value__sum|
-------------------+----------+
2022-03-27 00:00:00| 3|
2022-04-03 00:00:00| 7|
2022-04-10 00:00:00| 4|
如您所见,week_start
值是正确的,是星期日,但是value__sum
在周一至周日错误的周期中包含数据。 也许我错过了什么?
I have a such table in MySQL Database:
CREATE TABLE metrics (
id int(11) NOT NULL AUTO_INCREMENT,
date date NOT NULL,
value int(11) NOT NULL,
PRIMARY KEY (id)
) ENGINE InnoDB AUTO_INCREMENT=1 CHARSET=utf8mb4;
With the following values:
INSERT INTO metrics (date, value)
VALUES
('2022-04-01', 1),
('2022-04-02', 1),
('2022-04-03', 1),
('2022-04-04', 1),
('2022-04-05', 1),
('2022-04-06', 1),
('2022-04-07', 1),
('2022-04-08', 1),
('2022-04-09', 1),
('2022-04-10', 1),
('2022-04-11', 1),
('2022-04-12', 1),
('2022-04-13', 1),
('2022-04-14', 1);
I want to get sum of values grouping by weeks. Default week in MySQL is from Monday to Sunday, but I need to get grouping by week from Sunday to Saturday, so this is my query:
SELECT
(DATE_SUB(date, INTERVAL WEEKDAY(date) DAY) - INTERVAL 86400000000 MICROSECOND) AS week_start,
SUM(value) AS value__sum
FROM
metrics
GROUP BY
(DATE_SUB(date, INTERVAL WEEKDAY(date) DAY) - INTERVAL 86400000000 MICROSECOND)
ORDER BY
week_start ASC;
INTERVAL 86400000000 MICROSECOND
this interval is so strange because Django ORM do this. Anyway, I got such result:
week_start |value__sum|
-------------------+----------+
2022-03-27 00:00:00| 3|
2022-04-03 00:00:00| 7|
2022-04-10 00:00:00| 4|
As you can see week_start
value is right, it's Sunday but value__sum
contains data in wrong period Monday-Sunday.
Perhaps I've missed something?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个适合您吗?
我减去了
工作日
内部的一天。这将导致:
Does this work for you?
I subtracted the day inside of
WEEKDAY
.This results in:
您可以简单地使用Week()。如果这不是在正确的一天分开的,则可以使用
Week(Date_Add,Interval 1 Day))
用所需的数字(正或负)代替1。db<>>
You can simply use week(). If this is not splitting on the right day you can use
week(date_add, interval 1 day))
replacing 1 with the number (positive or negative) that you need.db<>fiddle here