我需要在 Toad Oracle 中根据下面概述的逻辑从表中过滤记录。
逻辑是:
customer.ID
和 customer.ORDERID
组合中 customer.CODE
的值为“TT”和“TP”,则加载值“TP”并忽略“TT”。注意:
ID
和ORDERID
列可以有多行。
我无法将此逻辑放入
WHERE
子句中,也无法理解如何根据给定逻辑选择和排除记录。请在这方面帮助我。
我尝试了
GROUP BY
,但它不起作用,因为我正在获取表的所有列。
从 Oracle 12 开始,在
DENSE_RANK
语句中使用 CASE
和 ORDER BY
表达式来优先考虑 TT
行而不是 TP
,然后使用 FETCH FIRST ROW WITH TIES
获取每组中优先级最高的行:
SELECT *
FROM customer
WHERE code IN ('TT', 'TP')
ORDER BY
DENSE_RANK() OVER (
PARTITION BY id, orderid
ORDER BY CASE code WHEN 'TT' THEN 1 ELSE 2 END
)
FETCH FIRST ROW WITH TIES
在早期版本中,您可以在内联视图中进行过滤:
SELECT *
FROM (
SELECT c.*,
DENSE_RANK() OVER (
PARTITION BY id, orderid
ORDER BY CASE code WHEN 'TT' THEN 1 ELSE 2 END
) AS rnk
FROM customer c
WHERE code IN ('TT', 'TP')
)
WHERE rnk = 1