【发布时间】:2021-03-17 10:42:48
【问题描述】:
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
order_date DATE,
customerID VARCHAR(255)
);
INSERT INTO customers
(order_date, customerID
)
VALUES
('2020-01-15', 'Customer_01'),
('2020-02-03', 'Customer_01'),
('2020-02-15', 'Customer_01'),
('2020-03-18', 'Customer_01'),
('2020-03-20', 'Customer_01'),
('2020-04-22', 'Customer_01'),
('2021-01-19', 'Customer_01'),
('2020-01-25', 'Customer_02'),
('2020-02-26', 'Customer_02'),
('2020-11-23', 'Customer_02'),
('2021-01-17', 'Customer_02'),
('2021-02-20', 'Customer_02');
预期结果:
order_date | quantity
| (fiscal year)
-------------|----------------------------------------------------
2020-01-15 | 1 --> Customer_01 appears the first time between 2019-03 and 2020-02
2020-01-25 | 1 --> Customer_02 appears the first time between 2019-03 and 2020-02
2020-02-03 | 0
2020-02-15 | 0
2020-02-26 | 0
2020-03-18 | 1 --> Customer_01 appears the first time between 2020-03 and 2021-02
2020-03-20 | 0
2020-04-22 | 0
2020-11-23 | 1 --> Customer_02 appears the first time between 2020-03 and 2021-02
2021-01-17 | 0
2021-01-19 | 0
2021-02-20 | 0
在上面的结果中,我想列出所有order dates 并计算每个财政年度的customers 不同的数量。 fiscal year 在日历年之后两个月开始,因此从 March 变为 February。
(例如,从 2020-03 到 2021-02)。
例如Customer_01 在2020-03 财政年度内首次出现在2020-03-18 直到2021-02。
因此,这个order_date 被分配给它1。
如果客户在会计年度内再次出现,则下一个order_date 将被分配给它0。
参考MariaDB 中的this question,我能够达到预期的结果,正如您在DB-Fiddle 中看到的那样。
但是,现在我想使用 postgresSQL 获得相同的结果。
因此,到目前为止,我已将查询修改为:
SELECT
order_date,
SUM(rn = 1) AS quantity
FROM
(SELECT
order_date,
row_number() over(PARTITION BY DATE_PART('year', (order_date - INTERVAL '2 month')::date), customerID ORDER BY order_date) rn
FROM customers
) t
GROUP BY 1;
但是,现在我在SUM(rn = 1) 部分收到错误function sum(boolean) does not exist。 postgresSQL 中的 SUM(rn = 1) 的等效语法是什么才能达到预期的结果?
【问题讨论】:
标签: sql postgresql