Mariadb

根據條件選擇一組行中的特定列值

  • January 16, 2022

我正在使用 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”問題,因為它要求多件事。更改IDGROUP_CONCAT(ID)

此外,更改ORDER BY以匹配GROUP BY.

引用自:https://dba.stackexchange.com/questions/306086