100

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');

Expected Result:

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

我想把表中的iterate算出来,算出sales_volume中的sum等于each month.
目前,我可以使用以下查询来实现这一点:

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条件的情况下迭代表?

推荐答案

demo:db<>fiddle

SELECT
    date_trunc('month', event_date) as month,
    SUM(sales_volume)
FROM (
    SELECT
        *,
        row_number() OVER (              -- 1
            PARTITION BY date_trunc('month', event_date) 
            ORDER BY event_date DESC
        )
    FROM sales 
) s
WHERE row_number <= 3                    -- 2
GROUP BY 1                               -- 3
  1. 使用row_number() window function按天的降序来列举一个月中的几天.所以最后一天是第1号,倒数第二天是第2号,以此类推.
  2. 筛选包含row_number个值<;=3的记录,这些值表示一个月的最后三天.
  3. date_trunc()函数计算的月份对这些记录进行分组

Sql相关问答推荐

使用group by后我的平均输出不是我想要的

如何在一个范围内进行分组.""范围值在范围表中定义

BigQuery`喜欢ANY‘和`不喜欢ANY’

如何在幂函数中正确使用Power()和Exp()

根据最大值为字母数字大小写分配数值

在Postgres中合并相似的表

如何用QuestDB生成蜡烛图?

SQL:查询作为子查询或CTE写入的最大和数失败

Postgres jsonpath运算符的变量替换,如_regex?

如何在T-SQL中编写row_number的WHERE子句?

删除行而不使数据库超载

连续天跟踪购买情况(将标记返回到另一列?)

DB2 SQL查询结果多余数据

确定小数中使用的精度位数

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

计算 BigQuery 中列的中值差 - 分析函数不能作为聚合函数的参数

如何从一张表中获取值在至少三行相同的记录

为什么在事务中未被后续使用的CTE执行SELECT...FOR UPDATE无效?

在 MS Access VBA 中,如何测量显示查询的时间?

从多个连接返回 1 行到同一个表 - SQL Server