一句話實現MySQL庫中的重疊分組

xiaohuihui發表於2020-06-28

列舉多個條件進行分組時,可能發生重疊,重疊部分僅計入某個組,還是計入所有符合條件的組,這在寫 SQL 時,寫法大不相同。

只計入第一個符合條件的組時,可以透過 case when 轉換成常規分組,例如:
select (case
              when age<=18 then ‘Teenager’
              when age>=16 and age<=30 then ‘Youth’
              when age>=28 and age<=45 then ‘MiddleAge’ end) g
       ,count(*) n
from A
group by g

如果重疊部分要計入所有組時,就麻煩多了。SQL 只支援等值分組,無法實現外部定義分組,對位分組。一般也就只能針對每個條件遍歷,然後再把結果集 union 到一起,條件多時, SQL 語句規模和效能都堪憂:
(select ‘Teenager’ g, count(*) n
from A
where age<=18)
union
…Youth…
union
…MiddleAge…

這種非常規分組如果用集算器 SPL,就容易得多。比如上面的問題把組條件和名稱透過引數傳進來 >w=[?<=18,?>=16&&?<=30,?>=28&&?<=45]
>wn=["Teenager","Youth","MiddleAge"]

只要一句話就能實現 不重疊 / 重疊(增加 @r選項)分組:
=connect(”mysqlDB”).query(“select * from A”).enum @r(w, age).new(wn(#):g, ~.len():n)

這句 SPL 還保證了返回結果集的次序,並且沒有匹配上的記錄也不會被遺漏。

SPL 還能實現更多非常規分組,可參考 。

當資料不在資料庫裡時,SPL 執行復雜計算仍然方便:
=file(“d:/t.csv”).import(;,",").enum...

SPL能很方便地嵌入到JAVA應用,可參考 。

具體使用方法可參考 。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2700912/,如需轉載,請註明出處,否則將追究法律責任。

相關文章