SQL: Самостоятельно соединить топ 1 из таблицы выбирает? (или лучший способ сделать это ...)
Вопрос
Это, вероятно, обсуждалось ранее (или это слишком просто), но я не могу найти легкий ответ: как это сделать: выберите (единственную) самую раннюю дату будущего и последнюю дату на идентификатор?
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