我有一份燃料输送表如下:
# -*- coding: utf-8 -*-
我知道4月1日我在坦克里有10,000升,所以现在我只想选择总产量。这意味着我想要20160328,20160301和20160203的记录。我正在使用Postgres,我想知道如何构造一个完成此任务的select语句。 我理解如何使用where子句来过滤日期小于4月1日的记录,但我不知道如何指示Postgres以反向日期顺序选择记录,直到选择的数量大于或等于10,000。 / p>
答案 0 :(得分:1)
with d as (
select *, sum(qty) over (order by date desc, time desc) as total
from delivery
where date between '20160101' and '20160401'
)
select *
from d
where total < 10000
union
(
select *
from d
where total >= 10000
order by date desc, time desc
limit 1
)
order by date desc, time desc
;
date | time | qty | total
------------+----------+------+-------
2016-03-28 | 17:10:00 | 5300 | 5300
2016-03-01 | 08:10:00 | 3400 | 8700
2016-02-03 | 09:00:00 | 6000 | 14700
数据:
create table delivery (date date, time time, qty int);
insert into delivery (date, time, qty) values
('20160101','0800',4500),
('20160203','0900',6000),
('20160301','0810',3400),
('20160328','1710',5300),
('20160402','1201',6000);
答案 1 :(得分:0)
您可以根据日期和时间的降序使用窗口函数创建一个运行总计,如下所示:
SELECT
Date,
Time,
Qty
FROM
(
SELECT
Date,
Time,
Qty,
SUM(Qty) OVER (ORDER BY Date DESC, Time DESC) AS Running_Total
FROM
fuel_deliveries
WHERE
Date < '20160402'
) rt
WHERE
Running_Total <= 10000;
内部/子查询获取运行总计,但是您希望在值小于或等于10000的位置对其进行过滤。