[英]Count and order comma separated values
我有下面的一列“表”(為數據模型道歉,不是我的錯:():
COL_IN
------
2K, E
E, 2K
O
我想獲得以下輸出,按計數降序排列:
COL_OUT COUNT
----------
K 4
E 2
O 1
您可以以這樣的方式使用分層查詢
WITH t2 AS
(
SELECT TRIM(REGEXP_SUBSTR(col_in,'[^,]+',1,level)) AS s
FROM t
CONNECT BY level <= REGEXP_COUNT(col_in,',')+1
AND PRIOR SYS_GUID() IS NOT NULL
AND PRIOR col_in = col_in
)
SELECT REGEXP_SUBSTR(s,'[^0-9]') AS col_out,
SUM(NVL(REGEXP_SUBSTR(s,'[^[:alpha:]]'),1)) AS count
FROM t2
GROUP BY REGEXP_SUBSTR(s,'[^0-9]'),REGEXP_SUBSTR(s,'[^[:alpha:]]')
ORDER BY count DESC
假設所有數據都是字母數字(例如,不包含特殊字符,如 $,#,! ..etc.)
COUNT
是保留關鍵字,因此它不是一個好的列名 - 即使在最終輸出中也是如此。 我使用COUNT_
代替(帶下划線)。
除此之外,您可以修改輸入字符串,使它們成為有效的 JSON 數組,以便您可以使用 JSON 函數來拆分它們。 將字符串拆分為標記后,將前導數字(如果存在)與字符串的其余部分分開並進行聚合是一件簡單的事情。 總和中的NVL
為每個沒有前導整數的標記加 1。
包括僅用於測試的示例數據(如果您有實際表,請刪除頂部的WITH
子句):
with
tbl (col_in) as (
select '2K, E' from dual union all
select 'E, 2K' from dual union all
select 'O' from dual
)
select ltrim(col, '0123456789') as col_out
, sum(nvl(to_number(regexp_substr(col, '^\d*')), 1)) as count_
from tbl,
json_table('["' || regexp_replace(col_in, ', *', '","') || '"]', '$[*]'
columns col path '$')
group by ltrim(col, '0123456789')
order by count_ desc, col_out
;
COL_OUT COUNT_
------- ------
K 4
E 2
O 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.