【问题标题】:Iterate through data and calculate the sum of the last three days of each month遍历数据,计算每个月最后三天的总和
【发布时间】:2023-02-20 22:39:04
【问题描述】:

DB-Fiddle

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    event_date DATE,
    sales_volume INT
);

INSERT INTO sales
(event_date, sales_volume)
VALUES 
('2023-01-27', '900'),
('2023-02-28', '500'),
('2023-01-29', '100'),
('2023-01-30', '600'),
('2023-01-31', '450'),
  
('2023-02-25', '300'),
('2023-02-26', '250'),
('2023-02-27', '845'),
('2023-02-28', '520'), 

('2023-03-26', '750'),
('2023-03-27', '750'),
('2023-03-28', '625'),
('2023-03-29', '885'),
('2023-03-30', '120'),
('2023-03-31', '400');

预期结果:

Row event_time sales_volume
1 1 1150
2 2 2115
3 3 1405

我想要迭代通过表格计算sales_volume每一个月.
目前,我能够使用此查询实现此目的:

SELECT
DATE_PART('month', s.event_date) AS event_time,
SUM(s.sales_volume) AS sales_volume
FROM sales s
WHERE s.event_date BETWEEN '2023-01-29' AND '2023-01-31'
OR s.event_date BETWEEN '2023-02-26' AND '2023-02-28'
OR s.event_date BETWEEN '2023-03-29' AND '2023-03-31'
GROUP BY 1
ORDER BY 1;

但是,我的原始数据库比示例大得多,所以我需要很多这样的 OR 条件。

我需要如何修改查询以便它在不使用 OR 条件的情况下遍历表?

【问题讨论】:

    标签: sql postgresql datetime


    【解决方案1】:

    demo:db<>fiddle

    SELECT
        row_number,
        SUM(sales_volume)
    FROM (
        SELECT
            *,
            row_number() OVER (
                PARTITION BY date_trunc('month', event_date) 
                ORDER BY event_date DESC
            )
        FROM sales 
    ) s
    WHERE row_number <= 3
    GROUP BY row_number
    

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 1970-01-01
      • 2010-09-18
      • 2012-03-12
      • 2016-03-23
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多