sql - 如何过滤复杂过滤器上的行

标签 sql oracle

我在表中有这些行

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/

相关文章:

sql - 尽管缺少分析值,但完整的日期时间列表

php - mysql表中有重复数据时替换数据

mysql - 这个查询看起来优化了吗?

java - 更新查询期间 long 类型乘以 double 类型(HQL)

NULL 和 VARCHAR 之间的 SQL 并集错误

.net - 如何进入Oracle开发?

oracle - PL/SQL ORA-01422 : exact fetch returns more than requested number of rows

sql - 使用 INNER JOIN 获取 DISTINCT 记录

oracle - Hibernate 分页或批处理

sql - Hibernate 创建标准两次连接同一个表 - 尝试了 2 种方法,但有 2 个差异错误