我正在使用 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
更多的
您提出的解决方案存在“only_full_group_by”问题,因为它要求多件事。更改
ID
为GROUP_CONCAT(ID)
。此外,更改
ORDER BY
以匹配GROUP BY
.