这是一个称为 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
和5
。
我希望查询返回max(date)
,如果有多个行具有相同的max(date)
,然后 用max(sent_order)
返回行。使用上面的示例与日期2017-05-29
,它仅应返回25
。
我看不到sum()
在哪里发挥作用。您似乎只想要最后一行:
select p.*
from packages p
order by date desc, sendorder desc
fetch first 1 row only;
如果您在显示时确实有序上升,则使用替代密钥ID字段更容易。
SELECT packages_sent
FROM packages
WHERE ID =
(SELECT max(ID)
FROM packages
WHERE date <= '2017-05-29');
由于ID始终随日期增加并发送订单找到最大的订单,也找到了另外两个步骤的最大值。