2011-01-20 4 views
0

이것은 이전에 논의되었을 것입니다 (또는 너무 간단합니다). 그러나 쉬운 대답을 찾을 수 없습니다 : 어떻게해야합니까? 가장 빠른 미래의 단일 날짜를 선택하십시오. ID 당 최신 날짜?SQL : 테이블 JOIN 상위 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 
+0

어떤 데이터베이스입니까? –

+0

CURRENT_TIMESTAMP ...를 표시하도록 수정 된 경우 (약간의 의사 코드였습니다 ...) – ajo

답변

0

난 당신이 사용할 수 있다고 생각 :

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 

그것은 당신이 작업을하는지 데이터베이스 불분명 - NOW NOW()로가 지원되는 동안 만 (2000 +) TSQL/SQL 서버 구문 TOP한다 MySQL과 PostgreSQL ... CURRENT_TIMESTAMP는 ANSI이며 모두가 지원합니다.

+0

감사합니다. 나는 그것을 시도 할 것이다. – ajo

+0

예상대로 작동했습니다! 감사. – ajo

0

왜 작동하지 않습니까?

select min(date) past_date,max(DATE)future_date 
from t1 
HAVING MIN(date) < CURRENT_TIMESTAMP AND MAX(DATE) < CURRENT_TIMESTAMP 
group by id 
관련 문제