【问题标题】:Group by days interval SQL按天间隔 SQL 分组
【发布时间】:2020-09-28 11:23:55
【问题描述】:

我有一个有 4 列的表格:

ID, Date, Office, Reports
  1. “日期”显示报告的创建时间。
  2. 创建办公室的“办公室”。
  3. “报告”创建的报告数量。

原始表格

  CREATE TABLE REPORTS (
    `ID` INTEGER,
    `Date` DATE,
    `Office` VARCHAR(2),
    `Reports` INTEGER
  );

  INSERT INTO REPORTS
    (`ID`, `Date`, `Office`, `Reports`)
  VALUES
    ('1', '2020-09-01', 'AR', '3'),
    ('2', '2020-09-01', 'ES', '2'),
    ('3', '2020-09-03', 'ES', '4'),
    ('4', '2020-09-05', 'AR', '1'),
    ('5', '2020-09-05', 'OG', '1'),
    ('6', '2020-09-05', 'ES', '4'),
    ('7', '2020-09-08', 'ES', '5'),
    ('8', '2020-09-08', 'AR', '6'),
    ('9', '2020-09-15', 'OG', '7'),
    ('10', '2020-09-16', 'ES', '9');

我需要使用 sql 行代码来获取显示所有日期(不显示重复日期)的表格,以及两个新列“Reports_7_days_prev”和“Reports_7_days_after”。结果应该如下表:

date       | Reports 7 prev | Reports 7 after
:--------- | -------------: | --------------:
2020-09-01 |              5 |              26
2020-09-03 |              9 |              21
2020-09-05 |             15 |              17
2020-09-08 |             26 |              18
2020-09-15 |             18 |              16
2020-09-16 |             16 |               9

每一列的计算方式如下:

  • “Reports 7 days prev”:它应该汇总每行日期前 7 天创建的所有报告。例如,在输出表中日期为“2020-09-15”的行中,结果 18 是日期间隔内“报告”列中所有值的总和 [2020-09-08 , 2020-09 -15],对应于“ID”为 7、8 和 9 => (5 + 6 + 7 = 18) 的行。

  • “Reports 7 days after”:它应该汇总每行日期后 7 天创建的所有报告。例如,在输出表中日期为“2020-09-05”的行中,结果 17 是日期间隔内“报告”列中所有值的总和 [2020-09-05 , 2020-09 -12],对应“ID”为4、5、6、7和8的行 => (1 + 1 + 4 + 5 + 6 = 17)

我认为我的 SQL 查询应该是这样的:

SELECT Date, 
       sum([QUERY 1]) as "Reports  7 days prev", 
       sum ([QUERY 2]) as "Reports 7 days after" 
FROM REPORTS 
GROUP BY Date

但我不知道我应该在 [QUERY 1] 和 [QUERY 2] 中包含什么以获得前 7 天和后 7 天。

非常感谢,

【问题讨论】:

  • 我正在使用 MySQL v5.7,我在此链接 db-fiddle.com 中创建了表

标签: mysql sql


【解决方案1】:

您可以使用 Scalar Correlated Subqueries,但不要期望有好的性能:

select date
  ,(select sum(reports) from REPORTS as r2 where r2.date between r.date - 7 and r.date) as `Reports 7 prev`
  ,(select sum(reports) from REPORTS as r2 where r2.date between r.date and r.date + 7) as `Reports 7 after`
from REPORTS as r
group by date

fiddle

【讨论】:

    【解决方案2】:

    如果不需要只使用一个 select 语句,您可以使用如下代码。

    INSERT INTO OUTPUT (Date) SELECT Date FROM REPORTS GROUP BY 1; 
    UPDATE OUTPUT SET PREV_7 = (SELECT SUM(Reports) FROM REPORTS WHERE Date BETWEEN OUTPUT.Date -7 AND OUTPUT.Date);
    UPDATE OUTPUT SET AFTER_7 = (SELECT SUM(Reports) FROM REPORTS WHERE Date BETWEEN OUTPUT.Date AND OUTPUT.Date + 7);
    

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 2016-09-21
      • 2017-03-22
      • 2010-09-16
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多