我将这些行放在一个表中
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我想要第三次交货(Delivery=3)的价格,如果没有第三次交货,我想要最后一次交货的价格。
它会给我这样的结果:
ID Name Price Delivery
== ==== ===== ========
3 apple 6 3
6 orange 5 7我不需要一个完整的解决方案,但一个寻找什么的想法将非常感谢。
发布于 2010-06-10 04:08:52
使用ROW_NUMBER两次-一次过滤掉第三次传递后的行,第二次查找剩余的最后一行(即典型的每组最大查询)。
我已经使用CTE实现了这一点。我在SQL Server中对其进行了测试,但我相信Oracle支持相同的语法。
WITH T1 AS (
SELECT
ID, Name, Price, Delivery,
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Delivery) AS rn
FROM Table1
), T2 AS (
SELECT
t1.*,
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Delivery DESC) AS rn2
FROM T1
WHERE rn <= 3
)
SELECT ID, Name, Price, Delivery
FROM T2
WHERE rn2 = 1结果:
ID Name Price Delivery
3 apple 6 3
6 orange 5 7 发布于 2010-06-10 15:46:10
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.EDIT:既然你想要“知道要寻找什么”,这里描述一下为什么我认为这个解决方案是最好的,除了是具有最少行数的查询。您预期的结果集表明您希望按水果名称对数据进行分组("group by name")。对于每个组,您希望保留delivery =3的记录值,或者当该数字不存在时,保留最后一个值("keep (dense_rank last order by nullif(delivery,3) nulls last")。在我看来,上面的查询就是这样的。它只使用一次表访问来获得结果,尽管我的查询在这方面不是唯一的。
问候你,罗伯。
发布于 2010-06-10 04:08:55
select t3.ID, t3.Name, t3.Price, t3.Delivery
from (
select Name, max(Delivery) as MaxDelivery
from MyTable
group by Name
) t1
left outer join MyTable t2 on t1.Name = t2.Name and Delivery = 3
inner join MyTable t3 on t1.Name = t3.name
and t3.Delivery = coalesce(t2.Delivery, t1.MaxDelivery)https://stackoverflow.com/questions/3009463
复制相似问题