簡體   English   中英

使用列的最大值從Oracle SQL表中過濾行

[英]Filter rows from oracle sql table using max value of a column

我正在學習oracle SQL,並且有一個如下表:

+--------+--------+------------------------+
| name   | nation | count                  |
+--------+--------+------------------------+
| Ruben  | UK     | 2                      |
| Ruben  | EEUU   | 16                     |
| Cesar  | UK     | 21                     |
| Cesar  | EEUU   | 12                     |
| Cesar  | FRANCE | 4                      |
| John   | FRANCE | 3                      |
| John   | UK     | 7                      |
| ....   | ..     | ..                     |
+--------+--------+------------------------+

上表代表我通過查詢創建的內聯視圖。 如您所見,該表按名稱和國家分組,並進行一些計數。 我想使用count列過濾表,使其具有以下內容:

+--------+--------+
| name   | nation |
+--------+--------+
| Ruben  | EEUU   |
| Cesar  | UK     |
| John   | UK     |
| ....   | ..     |
+--------+--------+  

如您所見,對於每個名稱,我都希望根據計數選擇國家。

您可以使用另一級別的內部查詢來執行此操作。 就像是:

select name, nation
from (
  select name, nation, cnt,
    row_number() over (partition by name, nation order by cnt desc) as rn
  from (
    select name, nation, count(*) as cnt
    from <your table>
  )
)
where rn = 1;

row_number()分析將一個偽列添加到最里面的查詢中,該查詢將每個名稱/國家/地區最高計數的行排名為1; 然后,最外面的查詢只會查看排名第一的查詢。

您需要決定如何處理關系-如果兩個國家/名稱行的計數相同,則可以使用rank()而不是row_number()來顯示兩者; 或者您可以通過在order by子句中添加另一列來決定選擇哪一個。 目前,如果有兩個相同的內容,它將只向您顯示其中一個-而且顯示的內容相當隨意。

使用keep解析關鍵字:

select name, min(nation) keep (dense_rank last order by cnt)
from (select name, nation, count(*) as cnt
      from /* your data source */
      group by name, nation)
group by name
  1. min(nation) -在這種情況下,min是沒有意義的,但是您必須保留它(如果沒有,則無法使用)
  2. keep -僅keep nation一項結果
  3. dense_rank last說要拾取最后一個元素
  4. order by cnt表示如何定義元素的順序

最終,它將為每個名字贏得最多國家的名聲。 可以達到相同的結果

select name, min(nation) keep (dense_rank first order by cnt desc)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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