MySQL分组的怪异行为

发布于 2025-01-24 07:11:15 字数 1387 浏览 4 评论 0原文

我在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

追风人 2025-01-31 07:11:15

这个适合您吗?

SELECT
    DATE_SUB(
      date, INTERVAL WEEKDAY(DATE_SUB(date, INTERVAL -1 DAY)) DAY
    ) AS week_start,    
    SUM(value) as value__sum
FROM
    metrics
GROUP BY
    week_start
ORDER BY
    week_start ASC;

我减去了工作日内部的一天。

这将导致:

Week_startValue__sum
2022-03-272
2022-04-037
2022-04-105

Does this work for you?

SELECT
    DATE_SUB(
      date, INTERVAL WEEKDAY(DATE_SUB(date, INTERVAL -1 DAY)) DAY
    ) AS week_start,    
    SUM(value) as value__sum
FROM
    metrics
GROUP BY
    week_start
ORDER BY
    week_start ASC;

I subtracted the day inside of WEEKDAY.

This results in:

week_startvalue__sum
2022-03-272
2022-04-037
2022-04-105
当爱已成负担 2025-01-31 07:11:15

您可以简单地使用Week()。如果这不是在正确的一天分开的,则可以使用Week(Date_Add,Interval 1 Day))用所需的数字(正或负)代替1。

 选择
  周(日期)“周”,
  和(值)“值”
来自指标
小组按每周(日期)
按星期(日期)订单;
 
周|价值
---:| ----::
  13 | 2
  14 | 7
  15 | 5

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.

select
  week(date) "week",
  sum(value) "value"
from metrics
group by week(date)
order by week(date);
week | value
---: | ----:
  13 |     2
  14 |     7
  15 |     5

db<>fiddle here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文