Oracle
在 Oracle 中選擇出現最多的 varchar2
我們需要在 Oracle 數據庫中對數據進行分組,並且必須得到 a
ProductNumber
和 aDescription
。Description
需要是表中出現次數最多的那個。兩者都是一個varchar2
。原始數據見下圖:預期結果:
我們已經嘗試過了,但沒有找到一種方法來包含出現
Description
次數最多的 。select distinct cnt1.ProductNumber from (select COUNT(*) as total, ProductNumber from Inventory group by ProductNumber) cnt1, (select MAX(total) as maxtotal, ProductNumber from (select COUNT(*) as total, ProductNumber from Inventory group by ProductNumber) group by ProductNumber) cnt2 where cnt1.total = cnt2.maxtotal;
在這裡你可以找到一個 fiddle。
你知道我們該怎麼做嗎?
這是使用視窗函式的一種方法:
select ProductNumber, Description from ( select ProductNumber, Description , row_number() over (partition by productnumber order by cnt1, cnt2 desc) as rn from ( select ProductNumber, Description , count(1) over (partition by ProductNumber) as cnt1 , count(1) over (partition by ProductNumber, Description) as cnt2 from inventory ) t ) u where rn = 1;
編輯:添加了一組稍大的數據的計劃,小提琴
真誠的詢問
----------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | ----------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 676 |00:00:00.01 | 122 | | | | | 1 | SORT UNIQUE | | 1 | 17576 | 676 |00:00:00.01 | 122 | 46080 | 46080 |40960 (0)| |* 2 | HASH JOIN SEMI | | 1 | 17576 | 17576 |00:00:00.01 | 122 | 2178K| 2050K| 2666K (0)| | 3 | TABLE ACCESS FULL | INVENTORY | 1 | 17576 | 17576 |00:00:00.01 | 61 | | | | |* 4 | VIEW | | 1 | 17576 | 676 |00:00:00.01 | 61 | | | | |* 5 | WINDOW SORT PUSHED RANK| | 1 | 17576 | 676 |00:00:00.01 | 61 | 48128 | 48128 |43008 (0)| | 6 | HASH GROUP BY | | 1 | 17576 | 676 |00:00:00.01 | 61 | 1214K| 1214K| 1854K (0)| | 7 | TABLE ACCESS FULL | INVENTORY | 1 | 17576 | 17576 |00:00:00.01 | 61 | | | | ----------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("T1"."DESCRIPTION"="I2"."DESCRIPTION") 4 - filter("T1"."RN"=1) 5 - filter(ROW_NUMBER() OVER ( PARTITION BY "I1"."PRODUCTNUMBER" ORDER BY COUNT(*) DESC )<=1)
H. Pauwelyn 修改後的查詢
------------------------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | ------------------------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | | 676 |00:00:00.01 | 122 | | | | | 1 | HASH UNIQUE | | 1 | 176 | 676 |00:00:00.01 | 122 | 2170K| 2170K| 1427K (0)| |* 2 | HASH JOIN RIGHT SEMI| | 1 | 176 | 676 |00:00:00.01 | 122 | 2546K| 2546K| 654K (0)| | 3 | VIEW | | 1 | 17576 | 676 |00:00:00.01 | 61 | | | | | 4 | HASH GROUP BY | | 1 | 17576 | 676 |00:00:00.01 | 61 | 1520K| 1520K| 1882K (0)| | 5 | TABLE ACCESS FULL| INVENTORY | 1 | 17576 | 17576 |00:00:00.01 | 61 | | | | | 6 | VIEW | | 1 | 17576 | 676 |00:00:00.01 | 61 | | | | | 7 | HASH GROUP BY | | 1 | 17576 | 676 |00:00:00.01 | 61 | 1520K| 1520K| 1882K (0)| | 8 | TABLE ACCESS FULL| INVENTORY | 1 | 17576 | 17576 |00:00:00.01 | 61 | | | | ------------------------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("CNT1"."TOTAL"="CNT2"."MAXTOTAL")
Lennart 的詢問
---------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | ---------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 676 |00:00:00.03 | 208 | | | | |* 1 | VIEW | | 1 | 17576 | 676 |00:00:00.03 | 208 | | | | |* 2 | WINDOW SORT PUSHED RANK| | 1 | 17576 | 676 |00:00:00.03 | 208 | 1116K| 557K| 991K (0)| | 3 | VIEW | | 1 | 17576 | 17576 |00:00:00.02 | 208 | | | | | 4 | WINDOW BUFFER | | 1 | 17576 | 17576 |00:00:00.02 | 208 | 1116K| 557K| 991K (0)| | 5 | INDEX FULL SCAN | IX1 | 1 | 17576 | 17576 |00:00:00.01 | 208 | | | | ---------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("RN"=1) 2 - filter(ROW_NUMBER() OVER ( PARTITION BY "PRODUCTNUMBER" ORDER BY "CNT1",INTERNAL_FUNCTION("CNT2") DESC )<=1)