2017-01-27 135 views
0

我正在查詢一張表(COURSEPLACE)以生成一組學生結果。這包含從課程表中取得的一系列變量。選擇距離另一個日期最近的日期

然後我想要加入地址表(其中包含每個學生的多個地址記錄),但只在結果上附加1個郵政編碼,該郵政編碼是在與學生記錄相同(或最近)的日期創建的創建。

我試過的是以下內容,但是這隻能得到那些日期值完全匹配的記錄 - 我如何將此擴展爲(有效)從地址記錄中查找並選擇郵政編碼值最接近的日期戳學生記錄日期戳?:

SELECT cp.CONTACTNO, cp.AGEONENTRY, cp.COURSETITLE, cp.FACULTY, ad.POSTCODE 
FROM COURSEPLACE cp 
LEFT OUTER JOIN ADDRESS ad ON ad.CONTACTNO=cp.CONTACTNO 
WHERE 
cp.TYPE = 'Application' 
AND cp.TERM = '2015/6' 
AND 
(
ad.TYPE = 'Home' AND CONVERT(VARCHAR(23),ad.CREATIONDATE,103) = CONVERT(VARCHAR(23),cp.CREATIONDATE,103) 
) 

回答

0
SELECT TOP 1 
    cp.CONTACTNO, cp.AGEONENTRY, cp.COURSETITLE, cp.FACULTY, ad.POSTCODE, 
FROM 
    COURSEPLACE cp 
    INNER JOIN ADDRESS ad ON ad.CONTACTNO=cp.CONTACTNO 
WHERE CP.TYPE = 'Application' 
    AND CP.TERM = '2016/5' 
    AND AD.TYPE = 'Home' 
ORDER BY 
    DATEDIFF(AD.CREATIONDATE, CP.CREATIONDATE) ASC; 
+0

Cheers @McNets - 這個也可以,謝謝你的幫助 – Jon295087

+0

不客氣。 – McNets

0

與OUTER APPLY解決了這個問題,給出回答前一個問題:

OUTER APPLY (SELECT TOP 1 * FROM ADDRESS ad2 WHERE ad2.CONTACTNO=cp.CONTACTNO ORDER BY DATEDIFF(dd,cp.CREATIONDATE,ad2.CREATIONDATE)) AD 
0

這給一掄....

SELECT cp.CONTACTNO, cp.AGEONENTRY, cp.COURSETITLE, cp.FACULTY, ad.POSTCODE 
FROM COURSEPLACE cp 
LEFT JOIN ADDRESS ad ON 
    ad.CONTACTNO=cp.CONTACTNO 
    INNER JOIN 
    (SELECT CONTACTNO, MAX(CREATIONDATE) dt 
    FROM ADDRESS 
    WHERE CREATIONDATE <= cp.CREATIONDATE 
    GROUP BY CONTACTNO) ad2 on ad2.dt = ad.CREATIONDATE and ad2.CONTACTNO = ad.CONTACTNO 
WHERE 
cp.TYPE = 'Application' 
AND cp.TERM = '2015/6' 
+0

感謝您看看這個@scsimon,這看起來工作得很好。 – Jon295087