SQL:从表格中选择自我加入顶部1? (或这样做的更好的方法……)
题
这可能是之前已经讨论过的(或者太简单了),但是我找不到一个简单的答案:应该如何完成:选择(单个)最早的日期和每个ID的最新日期?
t1: ==?==> (earliest) (most recent)
|id|date(DESC)| |id|future_date | past_date |
+==+==========+ +==+=============+===============+
|1 | d1 | | 1| d1 | d3 |
|2 | d2 | | 2| d2 | d6 |
(<==now) | 3| | d4 |
|1 | d3 |
|3 | d4 |
|1 | d5 |
|2 | d6 |
我正在考虑以下内容,但是我觉得这是相当复杂/不良的语法,而且我还没有弄清楚如何限制单个结果(即将来最新/最近)。有什么建议么?
SELECT t_1.id,t_1.date AS future_date,t_2.date AS past_date
FROM (SELECT * FROM t1 WHERE t1.date>CURRENT_TIMESTAMP) t_1
LEFT OUTER JOIN
(SELECT TOP 1 * FROM t1 WHERE t1.date<CURRENT_TIMESTAMP) t_2
ON t_1.id=t_2.id
解决方案
我认为您可以使用:
SELECT x.id,
MIN(y.date) AS future_date,
MAX(z.date) AS past_date
FROM (SELECT DISTINCT t.id
FROM YOUR_TABLE t) x
LEFT JOIN YOUR_TABLE y ON y.id = x.id
AND y.date > CURRENT_TIMESTAMP
LEFT JOIN YOUR_TABLE z ON z.id = x.id
AND z.date < CURRENT_TIMESTAMP
GROUP BY x.id
目前尚不清楚您正在使用哪个数据库 - 顶部是TSQL/SQL Server语法(2000+),而现在为 NOW()
由MySQL和PostgreSQL支持... Current_timestamp是ANSI,并得到所有人的支持。
其他提示
为什么这不起作用?
select min(date) past_date,max(DATE)future_date
from t1
HAVING MIN(date) < CURRENT_TIMESTAMP AND MAX(DATE) < CURRENT_TIMESTAMP
group by id
不隶属于 StackOverflow