mysql - 根据特定条件选择唯一行

标签 mysql sql

我有一个名为“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/

相关文章:

mysql - 错误代码 1054 交叉连接上的未知列

mysql - 线程化 shell 脚本

mysql - 如何使用 RegEx 更新 VARCHAR 列值?

java - 如何在Struts2或Hibernate中调用MySQL View

SQL Server 2008 将表达式转换为数据类型 int 的算术溢出错误

SQL查询数据库中的最新日期

c# - 数据库删除表

mysql - 将 NULL 值插入 postgreSQL 中的 TIMESTAMP 字段

mysql - 使用 GROUP_CONCAT 选择多对多关系

mysql - SQL语法错误导致数据库错误