我正在嘗試從具有特定列最小值的表中獲取記錄,但我希望該記錄中的其余資料不分組其中一個列。
這是樣本資料:

我想要一個將回傳的查詢:
1 月 24 日 0 月 3
日 2 月 12 日 0 月 1 日
uj5u.com熱心網友回復:
一種選擇是使用“排名”資料的分析函式;然后獲取排名最高的行。像這樣的東西:
樣本資料:
SQL> with test (month, day, c_initial, ending) as
2 (select 'jan', 24, 0, 3 from dual union all
3 select 'jan', 24, 1, 6 from dual union all
4 select 'jan', 24, 2, 2 from dual union all
5 select 'feb', 12, 0, 1 from dual union all
6 select 'feb', 12, 1, 6 from dual union all
7 select 'feb', 12, 2, 5 from dual
8 ),
查詢從這里開始:
9 temp as
10 (select t.*,
11 row_number() over (partition by month, day order by c_initial) rn
12 from test t
13 )
14 select month, day, c_initial, ending
15 from temp
16 where rn = 1;
MON DAY C_INITIAL ENDING
--- ---------- ---------- ----------
feb 12 0 1
jan 24 0 3
SQL>
如果有聯系,那么請考慮RANK。
此外,initial列名無效,因此我將其重命名為c_initial.
uj5u.com熱心網友回復:
@Littlefoot 可能給出了唯一合理的答案。但是,如果您的表非常大并且性能存在問題,則此版本可能更有效:
select month,
day,
min(c_initial) keep ( dense_rank first order by c_initial asc ) c_initial,
min(ending) keep ( dense_rank first order by c_initial asc ) ending
from your_table
group by month, day;
告訴 Oracle ,min() keep您只需要每組中具有最低值的值c_initial。因此,它可以丟棄它知道你不感興趣的值,而不是保留它們,對它們進行排序,然后給你第一個。
順便說一句,告訴 Oracle 回傳具有最低c_initial值的行的資料的是dense_rank first order by c_initial asc子句而不是min()函式。使用max()函式會給出完全相同的答案。我使用min()的只是一種風格的東西——它提醒我我正在尋找組中的第一行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478822.html
