寻找 SQL GROUP BY .... WHERE MIN 日期的解决方案
Looking for a solution to a SQL GROUP BY .... WHERE MIN date
编辑:以下问题同时针对 MS-SQL 和 MySQL。
我已经思考了 7 个小时了。我见过许多类似的堆栈溢出答案,但 none 我已经正确理解或弄清楚了如何实施。
我正在寻找 SELECT ID、标题、e.t.c e.t.c 来自 table,其中日期是 NOW() 之后的下一个可用日期。问题是,它需要按一个特定的列进行分组。
这里是 table:
==================================
id | name | date_start | sequence_id
--------------------------------------------------------
1 | Foo1 | 20150520 | 70
2 | Foo2 | 20150521 | 70
3 | Foo3 | 20150522 | 70
4 | Foo4 | 20150523 | 70
5 | FooX | 20150524 | 70
6 | FooY | 20150525 | 70
7 | Bar | 20150821 | 61
8 | BarN | 20151110 | 43
9 | BarZ | 20151104 | 43
这是我希望看到的:
==================================
id | name | date_start | sequence_id
--------------------------------------------------------
1 | Foo1 | 20150520 | 70
7 | Bar | 20150821 | 61
9 | BarZ | 20151104 | 43
结果按 MIN(date_start) > NOW() AND GROUPED BY sequence_id.
筛选
我不完全确定这可以通过 GROUP BY 实现,因为其余列需要包含在我认为行不通的聚合函数中。
有人能解决这个难题吗?
非常感谢!
西蒙
只需在子查询中使用 join
和聚合:
select t.*
from table t join
(select sequence_id, min(date_start) as minds
from table t
group by sequence_id
) tt
on tt.sequence_id = t.sequence_id and t.date_start = tt.minds;
这是标准 SQL,因此在任何数据库中都应该 运行。
http://sqlfiddle.com/#!9/d8576/4
SELECT *
FROM table1 as t1
LEFT JOIN
(SELECT *
FROM table1
WHERE date_start>NOW()
) as t2
ON t1.sequence_id = t2.sequence_id and t1.date_start>t2.date_start
WHERE t1.date_start>NOW() and t2.date_start IS NULL
GROUP BY t1.sequence_id
SELECT *
FROM table1 as t1
LEFT JOIN
(SELECT *
FROM table1
WHERE date_start>GetDate()
) as t2
ON t1.sequence_id = t2.sequence_id and t1.date_start>t2.date_start
WHERE t1.date_start>GetDate() and t2.date_start IS NULL
编辑:以下问题同时针对 MS-SQL 和 MySQL。
我已经思考了 7 个小时了。我见过许多类似的堆栈溢出答案,但 none 我已经正确理解或弄清楚了如何实施。
我正在寻找 SELECT ID、标题、e.t.c e.t.c 来自 table,其中日期是 NOW() 之后的下一个可用日期。问题是,它需要按一个特定的列进行分组。
这里是 table:
==================================
id | name | date_start | sequence_id -------------------------------------------------------- 1 | Foo1 | 20150520 | 70 2 | Foo2 | 20150521 | 70 3 | Foo3 | 20150522 | 70 4 | Foo4 | 20150523 | 70 5 | FooX | 20150524 | 70 6 | FooY | 20150525 | 70 7 | Bar | 20150821 | 61 8 | BarN | 20151110 | 43 9 | BarZ | 20151104 | 43
这是我希望看到的:
==================================
id | name | date_start | sequence_id -------------------------------------------------------- 1 | Foo1 | 20150520 | 70 7 | Bar | 20150821 | 61 9 | BarZ | 20151104 | 43
结果按 MIN(date_start) > NOW() AND GROUPED BY sequence_id.
筛选我不完全确定这可以通过 GROUP BY 实现,因为其余列需要包含在我认为行不通的聚合函数中。
有人能解决这个难题吗?
非常感谢!
西蒙
只需在子查询中使用 join
和聚合:
select t.*
from table t join
(select sequence_id, min(date_start) as minds
from table t
group by sequence_id
) tt
on tt.sequence_id = t.sequence_id and t.date_start = tt.minds;
这是标准 SQL,因此在任何数据库中都应该 运行。
http://sqlfiddle.com/#!9/d8576/4
SELECT *
FROM table1 as t1
LEFT JOIN
(SELECT *
FROM table1
WHERE date_start>NOW()
) as t2
ON t1.sequence_id = t2.sequence_id and t1.date_start>t2.date_start
WHERE t1.date_start>NOW() and t2.date_start IS NULL
GROUP BY t1.sequence_id
SELECT *
FROM table1 as t1
LEFT JOIN
(SELECT *
FROM table1
WHERE date_start>GetDate()
) as t2
ON t1.sequence_id = t2.sequence_id and t1.date_start>t2.date_start
WHERE t1.date_start>GetDate() and t2.date_start IS NULL