需要根据值的顺序获取结果行

Posted

技术标签:

【中文标题】需要根据值的顺序获取结果行【英文标题】:Need to fetch result row on basis of order of value 【发布时间】:2022-01-20 14:14:17 【问题描述】:
Item No    Date   Item Type         Item No   Date     Item Type
12345   12/17/2021  High            12345   12/17/2021  HIGH
23456   12/17/2021  Low             23456   12/17/2021  Low
78901   12/17/2021  Out             78901   12/17/2021  Out
12345   11/17/2021  Low             12345   11/17/2021  Low
23456   11/17/2021  High            23456   11/17/2021  High
78901   11/17/2021  Low             78901   11/17/2021  Low
12345   12/17/2021  HIGH                    
23456   12/17/2021  High                    Result Table
78901   12/17/2021  Low                 
78901   12/17/2021  High         
     Source table

我在右侧有源表,在左侧需要结果表。结果基于“项目类型”列:- Out, High , Low 。如果我有 2 行具有不同的“项目类型” 那么它应该在 Out>Low>High 的基础上只选择一个值。 例如:- 如果“ITEM NO”的值为 12345 并且它具有 High、Low 和 High,那么它应该取值为 High。 如果它只有 Low 和 High ,那么它应该把它当作 Low ,如果它只有 High ,它将把它当作 High 。 请帮助我查询,我如何实现它。

【问题讨论】:

【参考方案1】:

我会根据项目编号和日期组合对行进行排名,然后仅查询“第一个”:

SELECT item_no, date, item_type
FROM   (SELECT item_no, date, item_type
               RANK() OVER (PARTITION BY item_no, date
                            ORDER BY CASE item_type WHEN 'Out'  THEN 1
                                                    WHEN 'Low'  THEN 2
                                                    WHEN 'High' THEN 3
                                      END) AS rk
        FROM   my_table) t
WHERE  rk = 1

【讨论】:

感谢 Mureinik,假设我有类似的情况,例如 SELECT s.item_no, d.date, e.item_type FROM (SELECT s.item_no, d.date, e.item_type RANK() OVER (PARTITION BY s.item_no, d.date ORDER BY CASE e.item_type WHEN 'Out' THEN 1 WHEN 'Low' THEN 2 WHEN 'High' THEN 3 END) AS rk FROM table1 s, table d, table e) t WHERE rk = 1 ...我怎么能实现它,我有点新谢谢

以上是关于需要根据值的顺序获取结果行的主要内容,如果未能解决你的问题,请参考以下文章

在 sql developer 窗口中获取结果行

如何将 SQL 查询结果行作为具有不同标题名称的列? [关闭]

如何正确迭代所有 BigQuery 结果行?

使用 PIVOT 和 UNPIVOT实现查询结果行转列

Mysql UNION 方式与哪个表结果行不同

限制 PostgreSQL 最小时间间隔的结果行