我有下表
create table order(
id serial PK,
status varchar(255),
finish_time date
)
我想在3天内选择状态为“已完成”的最大订单数
例如,假设我有这样的内容
select * from orders;
id | status | finish_time
1 'finish' 2018-09-10
1 'finish' 2018-09-11
1 'finish' 2018-09-12
1 'finish' 2018-09-12
从September 10 to 12
(三天)开始的金额将为4。
从September 11 to 13
(3天)开始的金额将为3
所以答案应该是4
在Postgres中编写此类查询的方式是什么?
答案 0 :(得分:1)
您理想的情况是使用range between
处理日期的窗口函数。 las,Postgres还不支持。
这是另一种方法:
select o.*, o2.cnt
from orders o cross join lateral
(select count(*) as cnt
from orders o2
where o2.status = 'finish' and
o2.finish_time >= o.finish_time - interval '3 day' and
o2.finish_time <= o.finish_time
) o2
order by cnt desc
fetch first 1 row only;
答案 1 :(得分:0)
我将使用where子句,其日期大于子查询的日期,以获取最长减去3天的天数(查询1)。
或者,如果您想要一个具有前三天的特定日期,则使用一个where子句,该子句的日期应大于具有该日期的子查询-3天且小于或等于该日期(检查查询2)
例如:
架构(PostgreSQL v10.0)
CREATE TABLE orders (
id INTEGER,
status VARCHAR(8),
finish_time DATE
);
INSERT INTO orders
(id, status, finish_time)
VALUES
('1', 'finish', '2018-09-07'),
('2', 'finish', '2018-09-08'),
('3', 'finish', '2018-09-09'),
('4', 'finish', '2018-09-10'),
('5', 'pending', '2018-09-10'),
('6', 'finish', '2018-09-11'),
('7', 'finish', '2018-09-12'),
('8', 'finish', '2018-09-12'),
('9', 'pending', '2018-09-13');
查询#1
SELECT * FROM orders o
WHERE o.status = 'finish'
AND o.finish_time > (SELECT MAX(ord.finish_time) - INTERVAL '3 DAY' FROM orders ord WHERE ord.status = 'finish');
结果
| id | status | finish_time |
| --- | ------ | ------------------------ |
| 4 | finish | 2018-09-10T00:00:00.000Z |
| 6 | finish | 2018-09-11T00:00:00.000Z |
| 7 | finish | 2018-09-12T00:00:00.000Z |
| 8 | finish | 2018-09-12T00:00:00.000Z |
查询#2
SELECT * FROM orders o
WHERE o.status = 'finish'
AND o.finish_time > (SELECT DATE('2018-09-11') - INTERVAL '3 DAY')
AND o.finish_time <= (SELECT DATE('2018-09-11'));
结果
| id | status | finish_time |
| --- | ------ | ------------------------ |
| 3 | finish | 2018-09-09T00:00:00.000Z |
| 4 | finish | 2018-09-10T00:00:00.000Z |
| 6 | finish | 2018-09-11T00:00:00.000Z |