SQL: Самостоятельно соединить топ 1 из таблицы выбирает? (или лучший способ сделать это ...)

StackOverflow https://stackoverflow.com/questions/4744385

  •  13-10-2019
  •  | 
  •  

Вопрос

Это, вероятно, обсуждалось ранее (или это слишком просто), но я не могу найти легкий ответ: как это сделать: выберите (единственную) самую раннюю дату будущего и последнюю дату на идентификатор?

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top