如何选择未知期间的最大行数。 Postgres

时间:2018-12-03 10:24:27

标签: sql postgresql

我有下表

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中编写此类查询的方式是什么?

2 个答案:

答案 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 |

View on DB Fiddle