如何在日期顺序中选择总计为任意数量的记录?

时间:2016-06-07 15:57:05

标签: postgresql

我有一份燃料输送表如下:

# -*- coding: utf-8 -*-

我知道4月1日我在坦克里有10,000升,所以现在我只想选择总产量。这意味着我想要20160328,20160301和20160203的记录。我正在使用Postgres,我想知道如何构造一个完成此任务的select语句。 我理解如何使用where子句来过滤日期小于4月1日的记录,但我不知道如何指示Postgres以反向日期顺序选择记录,直到选择的数量大于或等于10,000。 / p>

2 个答案:

答案 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的位置对其进行过滤。

相关问题