首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在复杂筛选器上筛选行

如何在复杂筛选器上筛选行
EN

Stack Overflow用户
提问于 2010-06-10 04:01:32
回答 4查看 2.1K关注 0票数 5

我将这些行放在一个表中

代码语言:javascript
复制
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)的价格,如果没有第三次交货,我想要最后一次交货的价格。

它会给我这样的结果:

代码语言:javascript
复制
ID  Name    Price   Delivery
==  ====    =====   ========
3   apple   6       3
6   orange  5       7

我不需要一个完整的解决方案,但一个寻找什么的想法将非常感谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-10 04:08:52

使用ROW_NUMBER两次-一次过滤掉第三次传递后的行,第二次查找剩余的最后一行(即典型的每组最大查询)。

我已经使用CTE实现了这一点。我在SQL Server中对其进行了测试,但我相信Oracle支持相同的语法。

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
ID  Name    Price  Delivery
3   apple   6      3       
6   orange  5      7       
票数 3
EN

Stack Overflow用户

发布于 2010-06-10 15:46:10

代码语言:javascript
复制
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")。在我看来,上面的查询就是这样的。它只使用一次表访问来获得结果,尽管我的查询在这方面不是唯一的。

问候你,罗伯。

票数 4
EN

Stack Overflow用户

发布于 2010-06-10 04:08:55

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3009463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档