簡體   English   中英

對逗號分隔值進行計數和排序

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

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