这是一个名为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
。
答案 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。