SQL: auto REJOIGNEZ top 1 de SELECTs de table? (Ou bien mieux de le faire ...)
Question
Cela a probablement été discuté avant (il est trop simple), mais je ne peux pas trouver une réponse facile: Comment cela se fait: sélectionner la première date future (simple) et la date la plus récente par 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 |
Je pensais le long des lignes de ce qui suit, mais j'ai le sentiment que c'est la syntaxe plutôt compliquée / mauvaise, et je ne l'ai pas compris comment limiter aux résultats individuels (par exemple le plus récent / à l'avenir le plus proche). Toutes les suggestions?
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
La solution
Je pense que vous pouvez utiliser:
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
On ne sait pas quelle base de données vous travaillez avec - TOP est TSQL / SQL Server syntaxe uniquement (2000+), tandis que NOW NOW()
est pris en charge par MySQL et PostgreSQL ... CURRENT_TIMESTAMP est ANSI et pris en charge par tous
Autres conseils
pourquoi pas ce travail?
select min(date) past_date,max(DATE)future_date
from t1
HAVING MIN(date) < CURRENT_TIMESTAMP AND MAX(DATE) < CURRENT_TIMESTAMP
group by id