我有一个名为“trainings”的 SQL 表,如下所示:
+-----+-----------+--------+------------+------------+------------+-------+
| Id | Booked |Coach_No| Student_No | StartDate | EndDate | Color |
+-----+-----------+--------+------------+------------+------------+-------+
| 1 | 1 | 20 | NULL | 2011-03-18 |2011-03-19 | 3 |
| 2 | 1 | 20 | 45 | 2011-03-18 |2011-03-19 | 1 |
| 3 | 1 | 15 | 41 | 2011-03-20 |2011-03-21 | 18 |
| 4 | 0 | 21 | NULL | 2011-03-22 |2011-03-23 | 3 |
| 5 | 0 | 33 | NULL | 2011-03-20 |2011-03-21 | 3 |
| 6 | 0 | 34 | NULL | 2011-03-20 |2011-03-21 | 3 |
+-----+-----------+--------+------------+------------+------------+-------+
我希望构建一个 SQL 查询,该查询将获取具有唯一开始和结束日期的所有行。对于开始日期和结束日期重复的行,我需要优先选择颜色为 1 或 18 的行,而不是颜色为 3 的行。
我尝试使用下面的查询,但选择的不同行是 ID 最低的行
SELECT * FROM trainings GROUP BY StartDate,EndDate
什么是正确的方法?
最佳答案
您可以在 StartDate、EndDate
上分组依据
,并为不同的颜色优先级选择两个 ID。然后重新连接到原始表,优先选择高优先级:
select b1.*
from Trainings b1
join (
select max(case when Color in (1,18) then Id end) as HighPrioID
, max(case when Color not in (1,18) then Id end) as LowPrioID
from Trainings
group by
StartDate
, EndDate
) b2
on b1.Id = COALESCE(b2.HighPrioID, b2.LowPrioID);
测试数据:
drop table if exists Trainings;
create table Trainings (id int, StartDate datetime, EndDate datetime, Color int);
insert Trainings values
(1,'2011-03-18','2011-03-19', 3),
(2,'2011-03-18','2011-03-19', 1),
(3,'2011-03-20','2011-03-21',18),
(4,'2011-03-22','2011-03-23', 3),
(5,'2011-03-20','2011-03-21', 3);
关于mysql - 根据特定条件选择唯一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5276717/