---- ------ ------- --------- ---------
| 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 |
---- ------ ------- --------- ---------
我需要選擇這個表的所有欄位,但對于 id type 的每個組合只得到 1 行(我不關心型別的值)。但是我嘗試了一些方法沒有結果。
在我創建 DISTINCT 的那一刻,我無法包含其余欄位以使其在子查詢中可用。如果我在子查詢中添加 ROWNUM,所有行都將不同,從而無法正常作業。
一些想法?
我目前更好的查詢是這樣的:
SELECT ID, TYPE, VALUE, ACCOUNT
FROM MYTABLE
WHERE ROWID IN (SELECT DISTINCT MAX(ROWID)
FROM MYTABLE
GROUP BY ID, TYPE);
uj5u.com熱心網友回復:
您似乎需要為每個不同的 id 和 type 組合選擇一個(隨機)行。如果是這樣,您可以使用row_number分析函式有效地做到這一點。像這樣的東西:
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 知道。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361903.html
