2013-07-30 47 views
0

最新值我有兩個表結構如下:獲取每個日期

DECLARE @Table1 TABLE 
(
    IdColumn INT, 
    DateColumn DATETIME 
) 

DECLARE @Table2 TABLE 
(
    IdColumn INT, 
    DateColumn DATETIME, 
    Value NUMERIC(18,2) 
) 

我想要做的就是從表2中有一個表1小於或等於日期的最新值。

這是我建立的查詢:

SET NOCOUNT ON 

DECLARE @Table1 TABLE 
(
    IdColumn INT, 
    DateColumn DATETIME 
) 

DECLARE @Table2 TABLE 
(
    IdColumn INT, 
    DateColumn DATETIME, 
    Value NUMERIC(18,2) 
) 


DECLARE @RefDate DATETIME='2012-09-01' 
DECLARE @NMonths INT 
DECLARE @MonthsCounter INT=1 

SELECT @NMonths=DATEDIFF(MM,'2012-09-01','2013-03-01') 


WHILE @MonthsCounter<[email protected] 
BEGIN 

    INSERT INTO @Table1 
    SELECT 1,@RefDate 

    SET @RefDate=DATEADD(MM,1,@RefDate); 
    SET @MonthsCounter+=1; 

END 

INSERT @Table2 

SELECT 1,'2012-09-01',1000 
UNION 
SELECT 1,'2012-12-01',5000 
UNION 
SELECT 1,'2013-01-01',3000 



SELECT 
T1.IdColumn, 
T1.DateColumn, 
T2.Value 
FROM @Table1 T1 

LEFT JOIN @Table2 T2 
ON T2.IdColumn=T1.IdColumn AND T1.DateColumn>=t2.DateColumn 

問題是,當一個新的價值在於具有更近日期,我得到的所有的值,直到該日期。

IdColumn DateColumn    Value 
----------- ----------------------- --------------------------------------- 
1   2012-09-01 00:00:00.000 1000.00 
1   2012-10-01 00:00:00.000 1000.00 
1   2012-11-01 00:00:00.000 1000.00 
1   2012-12-01 00:00:00.000 1000.00 
1   2012-12-01 00:00:00.000 5000.00 
1   2013-01-01 00:00:00.000 1000.00 
1   2013-01-01 00:00:00.000 5000.00 
1   2013-01-01 00:00:00.000 3000.00 
1   2013-02-01 00:00:00.000 1000.00 
1   2013-02-01 00:00:00.000 5000.00 
1   2013-02-01 00:00:00.000 3000.00 

所需的輸出是這一個:

IdColumn DateColumn    Value 
----------- ----------------------- --------------------------------------- 
1   2012-09-01 00:00:00.000 1000.00 
1   2012-10-01 00:00:00.000 1000.00 
1   2012-11-01 00:00:00.000 1000.00 
1   2012-12-01 00:00:00.000 5000.00 
1   2013-01-01 00:00:00.000 3000.00 
1   2013-02-01 00:00:00.000 3000.00 

我怎麼能解決這個問題?

謝謝。

+0

它有可能你有3行相同的小時,分​​鍾,秒?或者你不保存這些信息? –

+0

每個日期可能有一行,日期是唯一的。 –

+0

但是在您的數據集示例中,您有更多的行具有相同的日期。所以,如果你對很多行有相同的日期,那麼你必須使用一個帶有頂級函數的子查詢,否則,你可以使用沒有它的子查詢,並僅基於日期/時間進行評估。 –

回答

1

我將與相關子查詢做到這一點:

select t1.*, 
     (select top 1 value 
     from @table2 t2 
     where t2.idColumn = t1.idColumn and 
       t2.dateColumn <= t1.dateColumn 
     order by t2.dateColumn desc 
     ) t2value 
from @table1 t1; 
+0

代碼在語法上不正確。 –

2

我只是張貼戈登的語法正確答案:

select t1.*, 
     (select top 1 value 
     from @table2 t2 
     where t2.IdColumn = t1.IdColumn and 
       t2.DateColumn <= t1.DateColumn 
     order by t2.DateColumn desc 
     ) t2value 
from @table1 t1 
+0

你可以告訴他。 – fancyPants

+1

我讚賞你修正了戈登的代碼,這就是爲什麼我投票給你。但既然你的答案是戈登的代碼的修復,我認爲這是公平的答案是正確的答案。 謝謝。 –

0

評論後,試試這個:

INSERT INTO #Table1 (IdColumn, DateColumn) 
SELECT IdColumn, DateColumn 
FROM #Table2 t 
WHERE NOT EXISTS 
    (
     SELECT 'X' 
     FROM #Table2 tcopy 
     where t.IdColumn = tcopy.IdColumn 
     and convert(date, t.DateColumn) = convert(date, tcopy.DateColumn) 
     and tCopy.DateColumn > t.DateColumn 
    ) 

我使用了「>」,因爲你告訴我,表格中沒有相同日期/時間的行2