0

我在 SQL Server 中工作。假设我有下表:

3/1/2013    aaa   7     5
1/1/2013    bbb   1     2
10/10/2012  ccc   5     8
9/9/2012    ddd   6     9
8/8/2012    bbb   2     3

我想从“bbb”行中获取值并将它们向上传播(按日期排序)基本上是:

3/1/2013    aaa   1     2
1/1/2013    bbb   1     2
10/10/2012  ccc   2     3
9/9/2012    ddd   2     3
8/8/2012    bbb   2     3

在 SQL Server 中执行此操作的最佳方法是什么?

4

2 回答 2

2

一些非常基本的东西可能是

SELECT MT.Date, MT.Text, 
       CASE WHEN MT.Text = 'bbb' THEN Number
            ELSE (SELECT TOP 1 Number 
                               FROM MyTable MT2 
                               WHERE MT2.Date < MT.Date AND 
                                     MT2.Text = 'bbb'
                               ORDER BY MT2.Date DESC)
            END Number,
       CASE WHEN MT.Text = 'bbb' THEN Number2
            ELSE (SELECT TOP 1 Number2 
                               FROM MyTable MT2 
                               WHERE MT2.Date < MT.Date AND 
                                     MT2.Text = 'bbb'
                               ORDER BY MT2.Date DESC)
            END Number2 
       FROM MyTable MT

SQLFiddle:http ://sqlfiddle.com/#!3/cbee5/3

或使用OUTER APPLY(应该更快)

SELECT MT.Date, MT.Text, 
       CASE WHEN MT.Text = 'bbb' THEN MT.Number
            ELSE MT2.Number 
            END Number,
       CASE WHEN MT.Text = 'bbb' THEN MT.Number2
            ELSE MT2.Number2
            END Number2
       FROM MyTable MT
       OUTER APPLY (SELECT TOP 1 MT2.Number, MT2.Number2 
                                 FROM MyTable MT2
                                 WHERE MT.Text <> 'bbb' AND 
                                       MT2.Text = 'bbb' AND 
                                       MT2.Date < MT.Date
                                 ORDER BY MT2.Date DESC
                   ) MT2

SQLFiddle:http ://sqlfiddle.com/#!3/cbee5/7

于 2013-08-07T19:18:37.613 回答
1

要选择,您可以很简单;

SELECT t1.date, t1.tag, t2.val, t2.val2
FROM Table1 t1
JOIN Table1 t2 
  ON t2.tag='bbb' AND t1.date >= t2.date
LEFT JOIN Table1 t3 ON t3.tag = 'bbb' AND t1.date >= t3.date AND t3.date > t2.date
WHERE t3.date IS NULL

一个用于测试的 SQLfiddle

更新表的内容,您可以使用几乎相同的查询;

UPDATE t1
SET val=t2.val, val2=t2.val2
FROM Table1 t1
JOIN Table1 t2 
  ON t2.tag='bbb' AND t1.date >= t2.date
LEFT JOIN Table1 t3 ON t3.tag = 'bbb' AND t1.date >= t3.date AND t3.date > t2.date
WHERE t3.date IS NULL

另一个 SQLfiddle

于 2013-08-07T20:08:05.933 回答