簡體   English   中英

SQL:從表SELECT自身加入前1名? (或者更好的方法……)

[英]SQL: self JOIN top 1 from table SELECTs? (or better way of doing it…)

這可能之前已經討論過(或者太簡單了),但是我找不到一個簡單的答案:應該怎么做:選擇(單個)最早的日期和每個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

目前尚不清楚您正在使用的數據庫-TOP僅是TSQL / SQL Server語法(2000+),而MySQL和PostgreSQL支持NOW as NOW() ... 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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM