我在表中有这些行
ID Name Price Delivery
== ==== ===== ========
1 apple 1 1
2 apple 3 2
3 apple 6 3
4 apple 9 4
5 orange 4 6
6 orange 5 7
如果没有第三次交货,我想要第三次交货(交货= 3)时的价格或最后一个价格。
它会给我这个:
ID Name Price Delivery
== ==== ===== ========
3 apple 6 3
6 orange 5 7
我没有必要想要一个完整的解决方案,但我将不胜感激。
最佳答案
SQL> create table t (id,name,price,delivery)
2 as
3 select 1, 'apple', 1, 1 from dual union all
4 select 2, 'apple', 3, 2 from dual union all
5 select 3, 'apple', 6, 3 from dual union all
6 select 4, 'apple', 9, 4 from dual union all
7 select 5, 'orange', 4, 6 from dual union all
8 select 6, 'orange', 5, 7 from dual
9 /
Table created.
SQL> select max(id) keep (dense_rank last order by nullif(delivery,3) nulls last) id
2 , name
3 , max(price) keep (dense_rank last order by nullif(delivery,3) nulls last) price
4 , max(delivery) keep (dense_rank last order by nullif(delivery,3) nulls last) delivery
5 from t
6 group by name
7 /
ID NAME PRICE DELIVERY
---------- ------ ---------- ----------
3 apple 6 3
6 orange 5 7
2 rows selected.
编辑 :由于您想要“了解要查找的内容”,这里说明了为什么我认为此解决方案是最好的,除了是行数最少的查询。您的预期结果集表明您希望按水果名称对数据进行分组(“按名称分组”)。在每个组中,您希望保留 Delivery = 3 的记录值,或者当该数字不存在时,最后一个(“keep (dense_rank last order by nullif(delivery,3) nulls last”)。在我的意见,上面的查询就是这样读的。它只使用一个表访问来获取结果,尽管我的查询不是唯一的。
问候,
抢。
关于sql - 如何过滤复杂过滤器上的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3009463/