[英]ORACLE SELECT DISTINCT VALUE ONLY IN SOME COLUMNS
+----+------+-------+---------+---------+
| id | order| value | type | account |
+----+------+-------+---------+---------+
| 1 | 1 | a | 2 | 1 |
| 1 | 2 | b | 1 | 1 |
| 1 | 3 | c | 4 | 1 |
| 1 | 4 | d | 2 | 1 |
| 1 | 5 | e | 1 | 1 |
| 1 | 5 | f | 6 | 1 |
| 2 | 6 | g | 1 | 1 |
+----+------+-------+---------+---------+
我需要獲得該表所有字段的 select 但對於 id+type 的每個組合只能獲得 1 行(我不在乎類型的值)。 但我嘗試了一些沒有結果的方法。
在我進行 DISTINCT 的那一刻,我不能包含字段的 rest 以使其在子查詢中可用。 如果我在子查詢中添加 ROWNUM ,所有行都會不同,這會導致它不起作用。
一些想法?
我目前更好的查詢是:
SELECT ID, TYPE, VALUE, ACCOUNT
FROM MYTABLE
WHERE ROWID IN (SELECT DISTINCT MAX(ROWID)
FROM MYTABLE
GROUP BY ID, TYPE);
似乎您需要為每個不同的 id 和類型組合 select 一個(隨機)行。 如果是這樣,您可以使用row_number
分析 function 有效地做到這一點。 像這樣的東西:
select id, type, value, account
from (
select id, type, value, account,
row_number() over (partition by id, type order by null) as rn
from your_table
)
where rn = 1
;
order by null
表示每組(分區)內的行按(id,type)隨機排序; 這意味着在這種情況下,通常很耗時的訂購步驟將變得微不足道。 此外,Oracle 優化了此類查詢(對於過濾器rn = 1
)。
或者,在 12.1 及更高版本中,您可以使用match_recognize
子句獲得相同的結果:
select id, type, value, account
from my_table
match_recognize (
partition by id, type
all rows per match
pattern (^r)
define r as null is null
);
這將按 id 和類型對行進行分區,它不對它們進行排序(這意味着隨機排序),並且只從每個分區中選擇“第一”行。 請注意,一些分析函數,包括row_number()
,需要order by
子句(即使我們不關心排序) - order by null
是習慣性的,但不能完全省略。 相比之下,在match_recognize
中,您可以省略order by
子句(默認為“隨機順序”)。 另一方面,您不能省略define
子句,即使它沒有施加任何條件。 為什么 Oracle 也不使用該子句的默認值,只有 Oracle 知道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.