Mariadb
根據條件選擇一組行中的特定列值
我正在使用 mariadb 伺服器版本 10.6.4。
這是我的表定義:
CREATE TABLE `tmp_dba` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `case_id` bigint(20) DEFAULT NULL, `client_id` bigint(20) NOT NULL, `arrival` date DEFAULT NULL, `departure` date DEFAULT NULL, PRIMARY KEY (`ID`) )
以下是一些範例數據:
INSERT INTO `tmp_dba` VALUES (1,10,1000,'2018-10-02','2019-04-25'), (2,10,1000,'2019-04-26','2019-05-01'), (3,10,1000,'2019-05-02',NULL), (4,20,2000,'2018-11-21',NULL), (5,20,2001,'2018-11-21',NULL), (6,20,2002,'2018-11-21',NULL), (7,30,3000,'2019-03-04','2022-01-01'), (8,30,3001,'2019-03-04','2022-01-01'), (9,30,3002,'2019-03-04','2022-01-01'), (10,30,3003,'2019-03-04','2022-01-01'), (11,30,3004,'2019-03-04','2022-01-01');
我想要實現的是確定每組 case_id 和 client_id 的 MIN(arrival),如果離開不為空,則應該顯示 MAX(departure),否則為空。
我想最終每個客戶只有一行提供上述數據。
例如對於 case_id = 10 我想看到 1 行這樣:
10;1000;2018-10-02;NULL
。對於 case_id = 20,結果應該是 4 行,因為 case_id 和 client_id 有 4 種不同的組合。
對於 case_id = 30,應該顯示 5 行,因為 case_id 和 client_id 有 5 種不同的組合。
使用 group by 時我一定做錯了什麼。
更多的資訊:
- 數據是連續的,這意味著輸入的新記錄將具有比舊記錄更高的 ID。此外,新的記錄將——相對於之前的記錄——在未來總是如此。這並不意味著下一個記錄總是會在最後一次出發後的第二天到達。
- 同一客戶的表中的新記錄將始終設置先前記錄的出發日期。在這種情況下,以前的記錄離開不能為空。
- 當沒有離開並且客戶仍然“進入”時,離開將始終為空。
- 出發時間必須小於到達時間,除非出發時間為空。
- 到達不能為空。
這是可行的嗎?
解決方案
SELECT -- First solution, but wrong, GROUP_CONCAT(ID) avoids error below -- ID, case_id, client_id, <-- only_full_group_by - error GROUP_CONCAT(ID), case_id, client_id, MIN(arrival) AS arrival, IF(COUNT(departure) = COUNT(*), MAX(departure), NULL) AS departure FROM tmp_dba GROUP BY case_id, client_id ORDER BY case_id, client_id
非常感謝您的幫助。
斯蒂菲
到目前為止你有什麼程式碼?我假設您正在使用
GROUP BY case_id, client_id
.發現是否有任何 (跨組)與. 這是因為計算所有行;另一個只計算. 因此,這就是您可以製作離開表達式的方式:
departure``NULL``COUNT(*) = COUNT(departure)``COUNT(*)``departure IS NOT NULL
IF(COUNT(departure) = COUNT(*), MAX(departure), NULL)
更多的
您提出的解決方案存在“only_full_group_by”問題,因為它要求多件事。更改
ID
為GROUP_CONCAT(ID)
。此外,更改
ORDER BY
以匹配GROUP BY
.