如何计算 Postgresql 中按月购买的 2/3?

Posted

技术标签:

【中文标题】如何计算 Postgresql 中按月购买的 2/3?【英文标题】:How to calculate the 2/3 purchased by month in Postgresql? 【发布时间】:2019-11-16 22:20:03 【问题描述】:

我有一张名为“sales”的表。

create table sales
    (
        cust    varchar(20),
        prod    varchar(20),
        day integer,
        month   integer,
        year    integer,
        state   char(2),
        quant   integer
    );
insert into sales values ('Bloom', 'Pepsi', 2, 12, 2001, 'NY', 4232);
insert into sales values ('Knuth', 'Bread', 23, 5, 2005, 'PA', 4167);
insert into sales values ('Emily', 'Pepsi', 22, 1, 2006, 'CT', 4404);
insert into sales values ('Emily', 'Fruits', 11, 1, 2000, 'NJ', 4369);
insert into sales values ('Helen', 'Milk', 7, 11, 2006, 'CT', 210);
insert into sales values ('Emily', 'Soap', 2, 4, 2002, 'CT', 2549);
insert into sales values ('Bloom', 'Eggs', 30, 11, 2000, 'NJ', 559);

.... 总共有 498 行。以下是该表的概述:

现在我想获取客户和产品的每个组合购买了 2/3 的销售数量的月份。

结果应该是这样的:

有没有人可以帮我解决这个问题?

【问题讨论】:

向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。 How to create a Minimal, Complete, and Verifiable example 【参考方案1】:

你可以使用窗口函数,然后聚合:

select year, cust, prod, min(month)
from (
    select 
        s.*,
        sum(quant) over(partition by year, cust, prod order by month, day) quant_cumul,
        sum(quant) over(partition by year, cust, prod) quant_total
    from sales s
) t
where quant_cumul > 2/3 * quant_total
group by year, cust, prod

内部查询计算每个(year, cust, prod) tupe 的累积总和和数量的全局总和。然后外层查询过滤累计总和超过总量2/3的记录,得到每个元组的最小月份。

【讨论】:

以上是关于如何计算 Postgresql 中按月购买的 2/3?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 中按月计算分类列?

如何在bigquery中按月/年汇总

想在mysql中按月计算休假天数

如何在 presto SQL 中按月分组

如何在bigquery中按月创建分区

在 sqlite 中按月分组