簡體   English   中英

ORACLE SELECT 僅在某些列中的不同值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM