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

枚舉多個條件進行分組時,可能發生重疊,重疊部分僅計入某個組,還是計入所有符合條件的組,這在寫 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 還能實現更多非常規分組,可參考c.raqsoft.com.cn/article/1559481018562

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

SPL能很方便地嵌入到JAVA應用,可參考《Java 如何調用 SPL 腳本》

具體使用方法可參考 《如何使用集算器》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章