SQL 如何查詢每個分組都出現的欄位值
資料分組以後,要找出在每個分組中都出現的某個欄位值。
用SQL來解決這個問題並不容易!
SQL缺少單純的分組操作,只能返回各分組的統計值,而不能對各組的成員再進行更細的交、差、並等集合運算。要解決這種問題就需要多層巢狀子查詢來變相地實現。
舉個例子:查詢每週都加班的員工以進行表彰。現有加班資料表OVERTIME_WORK資料如下:
WORKDATE | NAME |
2019-07-01 | Tom |
2019-07-02 | John |
2019-07-03 | Tom |
2019-07-04 | Cart |
2019-07-08 | Tom |
2019-07-09 | Jordan |
2019-07-10 | Kate |
2019-07-10 | John |
2019-07-15 | Leon |
2019-07-16 | John |
2019-07-17 | Tom |
2019-07-18 | John |
2019-07-22 | Jim |
2019-07-23 | Tom |
2019-07-24 | John |
2019-07-25 | Cart |
… | … |
以Oracle為例,用SQL寫出來是這樣:
WITH A AS
(SELECT COUNT(*) NUM FROM
(SELECT DISTINCT TO_CHAR(WORKDATE,'IW') FROM OVERTIME_WORK )
),
B AS
(SELECT TO_CHAR(WORKDATE,'IW') W, NAME
FROM OVERTIME_WORK
GROUP BY TO_CHAR(WORKDATE,'IW'), NAME
),
C AS
(SELECT NAME, COUNT(*) NUM FROM B GROUP BY NAME )
SELECT NAME FROM C WHERE NUM=(SELECT NUM FROM A);
這裡的A查出共有幾周,B查出每週加班的不同員工,C查出B裡各員工的出現次數,最後從C裡選出出現次數與總週數相等的員工。解決思路比較繞,這種SQL既難寫又難懂。
集算器的SPL語言支援集合運算,解決這個問題就會簡單很多,計算出每週加班員工的交集即可,只需1行程式碼:
connect("mydb").query("SELECT * FROM OVERTIME_WORK").group((WORKDATE-date("2019-07-01"))\7).(~.(NAME)).isect()
【問題延伸】
* 查詢每週至少加班兩次的員工
* 查詢每個月消費金額均排在前20名的客戶名稱
SPL 擅長解決這類分組子集和組內有序計算,請閱 、 、 、
集算器 SPL 是解決 SQL 難題的專業指令碼語言,它語法簡單,符合自然思維,是天然分步、層次清晰的程式導向計算語言。它採用與資料庫無關的統一語法,編寫的演算法可在資料庫間無縫遷移。它是桌面級計算工具,即裝即用,配置簡單,除錯功能完善,可設定斷點、單步執行,每步執行結果都可檢視。請參閱
SPL也能很方便地嵌入到JAVA應用,可參考 。
具體使用方法可參考 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2699098/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL 如何計算每個分組的中位數SQL
- MySQL如何查詢某個欄位含有字母數字的值MySql
- mysql sql同一個欄位多個行轉成一個欄位查詢MySql
- SQL-分組聚合 - 單欄位分組SQL
- 查詢oracle欄位預設值Oracle
- MySQL查詢某個欄位含有字母數字的值MySql
- mysql基礎 依據一個欄位查詢另外一個欄位存在不同的值MySql
- sql根據多個欄位查詢重複記錄SQL
- 在 with 查詢中只查詢個別欄位
- SQL Server 查詢表註釋和欄位SQLServer
- MySQL資料庫查詢多個欄位值全部相同的記錄MySql資料庫
- Native for sql 查詢列欄位非命令列形式SQL命令列
- Django框架:8、聚合查詢、分組查詢、F與Q查詢、ORM查詢最佳化、ORM事務操作、ORM常用欄位型別、ORM常用欄位引數Django框架ORM型別
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- Laravel ORM 中,根據關聯查詢的欄位值,對主查詢排名LaravelORM
- Sql查詢 一個表中某欄位的資料在另一個表中某欄位中不存在的SQL
- mongodb查詢資料庫中某個欄位中的值包含某個字串的方法MongoDB資料庫字串
- SQL 兩個表組合查詢SQL
- SQL:查詢每個類別最新的5條記錄SQL
- MySQL Connector/Python 查詢如何返回欄位名MySqlPython
- 揭秘PostgreSQL:如何查詢表欄位名稱SQL
- 查詢/刪除重複的資料(單個欄位和多個欄位條件)
- SQL 查詢中的 NULL 值SQLNull
- 如何查詢某個資料表中除某個欄位的所有資訊???
- 編寫一個 SQL 查詢來實現分數排名。SQL
- MySQL簡單實現多欄位模糊查詢MySql
- 分組查詢
- sql設定欄位預設值SQL
- 同一張表的兩個欄位比較查詢
- Drupal 如何得到欄位的值?
- 查詢統計SQL分組求和使用小技巧SQL
- 記如何在預載入中指定查詢的欄位
- .net 6 使用 NEST 查詢,時間欄位傳值踩坑
- Spark SQL解析查詢parquet格式Hive表獲取分割槽欄位和查詢條件SparkSQLHive
- 面試題:問題1、查詢每個學期每門課程最高分記錄(包含全部5個欄位) 問題2、查詢與前一個學期相比成績有提高的記錄(包含全部5個欄位)面試題
- Elasticsearch 複合查詢——多字串多欄位查詢Elasticsearch字串
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- SqlServer根據特定欄位分組後,對需要欄位進行分組拼接SQLServer