查找最高(最大)日期查询,然后从上一查询的结果中找到最大值

时间:2019-02-20 22:17:26

标签: sql postgresql

这是一个名为packages的表:

id  packages_sent    date         sent_order
1 | 10             | 2017-02-11 | 1
2 | 25             | 2017-03-15 | 1
3 | 5              | 2017-04-08 | 1
4 | 20             | 2017-05-21 | 1
5 | 25             | 2017-05-21 | 2
6 | 5              | 2017-06-19 | 1

此表显示在给定日期发送的包裹数;如果在同一日期发送了多个包裹(第4行和第5行就是这种情况),则sent_order会跟踪它们的发送顺序。

在以下情况下,我试图进行查询以返回sum(packages_sent):首先,返回包含max(date)的行(给定日期),第二,如果有多行,则返回具有相同max(date)的行,返回具有max(send_order)(最高send_order值)的行。

这是我到目前为止的查询:

SELECT sum(packages_sent)
FROM packages 
WHERE date IN
    (SELECT max(date)
    FROM packages
    WHERE date <= '2017-05-29');

此查询正确找到了最大日期,即2017-05-21,但是对于sum,它返回了45,因为它正在添加行4和{{1} }。

我希望查询返回5,如果有多行具有相同的max(date),则 then 返回带有max(date)的行。使用上面带有日期max(sent_order)的示例,它应该只返回2017-05-29

2 个答案:

答案 0 :(得分:1)

我看不到sum()在哪里起作用。您似乎只想要最后一行:

select p.*
from packages p
order by date desc, sendorder desc
fetch first 1 row only;

答案 1 :(得分:0)

如果数据按照显示的顺序真正升序,那么使用代理键ID字段会更容易。

SELECT packages_sent
 FROM packages 
WHERE ID = 
  (SELECT max(ID)
    FROM packages
    WHERE date <= '2017-05-29');

由于ID总是随着日期和发送订单而增加,因此查找ID的最大值也可以一步找到其他两个ID。