2015-04-06 116 views
0

您好,我在處理一些SQL數據時遇到了問題,並且返回了一些最近的日期值。我有兩個表:SQL最近的日期

表1

ID  Content   Date 
-------------------------------------------- 
    123 X    2013-11-18 
    123 ZE    2013-11-29 
    233 YX    2013-12-30 
    233 XX    2013-12-28 
    444 Z    2014-02-24 

表2

ID  Value   Validation Date 
-------------------------------------------- 
    123 0.54    2013-11-11 
    123 0.42    2013-11-18 
    123 0.32    2013-11-27 
    233 1.2    2013-12-4 
    233 1.1    2013-12-28 
    233 1.0    2013-12-29 
    444 4     2014-02-11 
    444 3     2014-02-15 
    444 2     2014-02-23 

,我假裝是這樣的輸出:

ID  Content   Date   Value  Validation Date 
------------------------------------------------------------------------ 
    123 X    2013-11-18  0.42   2013-11-18 
    123 ZE    2013-11-29  0.32   2013-11-27 
    233 YX    2013-12-30  1.0   2013-12-29 
    233 XX    2013-12-28  1.1   2013-12-28 
    444 Z    2014-02-24  2   2014-02-23 

所以我想回回來驗證日期最接近日期的值(驗證日期必須始終小於日期) 。你能幫我麼?表1和2中的ID不是唯一的。

+0

?它是一列,或者第一列不是列,它是記錄編號或...... waht ......澄清它? – jfun

+0

身份證號碼是123,233和444.身邊的號碼是記錄號碼,除非有必要,否則我不會假裝與他們一起工作。 – RVeloso

回答

1

您可以使用下面的查詢:

SELECT ID, Content, [Date], Value, [Validation Date] 
FROM (
    SELECT t1.ID, Content, [Date], Value, [Validation Date], 
      ROW_NUMBER() OVER (PARTITION BY t1.ID, Content 
          ORDER BY DATEDIFF(d, [Validation Date], [Date])) AS rn 
    FROM Table1 AS t1 
    INNER JOIN Table2 AS t2 ON t1.ID = t2.ID AND [Validation Date] <= [Date] 
) t 
WHERE t.rn = 1 

ROW_NUMBER()用於跟蹤與最小[Date]記錄 - 每(IDContent)對值[Validation Date]差異。

+0

僅在表格1上返回1個ID。在表格1中,我有超過1個相同的ID。我編輯了這個問題。 – RVeloso

+0

@RVeloso在這種情況下,只需通過添加「Content」來更改「PARTITION BY」子句。請參閱我所做的修改。 –

+0

@Giorgios Betsos偉大的答案,完美的作品 – RVeloso

0

我認爲做到這一點的唯一方法是相關性。類似的東西。

SELECT a.id, a.content, a.date, 
     (SELECT TOP 1 b.value, b.validate 
     FROM table2 b 
     WHERE b.id=a.id 
     ORDER BY b.validate DESC) from table1 a 
0

試試這個:

SELECT a.id, 
     a.content, 
     a.date, 
     b.valu, 
     b.validationdate 
FROM (select tt.id, 
     tt.content, 
     tt.date, 
     row_number() over(partition by tt.id order by tt.date desc) rn 
    from table1 tt) a 
JOIN (select t.id, 
     t.content, 
     t.date, 
     t.valu, 
     t.validationdate, 
     row_number() over(partition by t.id order by t.validationdate desc) rn 
    from table2 t) b 
on a.id=b.id and a.rn=b.rn 
+0

這個答案的問題是,對於每個a.ID它只返回b.validationdate和b.result相應的最新a.Date。 – RVeloso

+0

但是在期望的輸出中我看到你想要我編輯的最近驗證日期 – jfun

+0

知道,因爲id不是唯一的。我想要最近的驗證日期考慮每行的日期。 – RVeloso

0

我認爲最好的辦法是使用outer apply:爲什麼你在一個名稱下顯示前兩列

select t1.id, t1.content, t1.date, t2.value, t2.validdate 
from table1 t1 outer apply 
    (SELECT TOP 1 t2.value, t2.validdate 
     FROM table2 t2 
     WHERE t2.id = t1.id 
     ORDER BY t2.validdate DESC 
    ) t2;