2013-10-23 103 views
1

我试图从结果集中获取以前的值。
我有一个表“表A”,这看起来是这样的 -SQL Server从现有结果集中获取以前的值

ColumnID ColumnValue 
1   100 
2   NULL 
3   NULL 
4   0 
5   10 
6   100 
7   100 

我得到使用此查询以下结果集 -

"Select ColumnID, ColumnValue from TableA 
WHERE ColumnValue = 100 
ORDER BY ColumnID DESC" 

ColumnID ColumnValue 

7   100   
6   100   
1   100 

现在我需要一个多列添加到结果集我具有(先前的查询), ,它给出了现有结果集的“WITHIN”的前一个ColumnID。
我在结果集内提到,因为ColumnID不遵循任何顺序。 像在这种情况下,从7,6去,然后直奔1

ColumnID ColumnValue PreviousColumnID 
7   100   6 
6   100   1 
1   100   NULL 

任何帮助吗? 我使用SQL Server 2008

回答

1

这是稍微令人费解,但它似乎工作:

select ColumnID, ColumnValue, 
    (select top 1 ColumnID 
    from (Select ColumnID, ColumnValue from TableA 
      WHERE ColumnValue = 100) T2 
    where T2.ColumnId < TableA.ColumnId 
    order by ColumnID DESC) 
from TableA 
WHERE ColumnValue = 100 
ORDER BY ColumnID DESC 

下面是一个完整的测试脚本:

create table TableA (ColumnID int, ColumnValue int) 

insert TableA values (1, 100) 
insert TableA values (2, NULL) 
insert TableA values (3, NULL) 
insert TableA values (4, 0) 
insert TableA values (5, 10) 
insert TableA values (6, 100) 
insert TableA values (7, 100) 

Select ColumnID, ColumnValue from TableA 
WHERE ColumnValue = 100 
ORDER BY ColumnID DESC 

select ColumnID, ColumnValue, 
    (select top 1 ColumnID 
    from (Select ColumnID, ColumnValue from TableA 
      WHERE ColumnValue = 100) T2 
    where T2.ColumnId < TableA.ColumnId 
    order by ColumnID DESC) 
from TableA 
WHERE ColumnValue = 100 
ORDER BY ColumnID DESC 
0

使用假的排序列num

SELECT MIN (CASE x WHEN 0 THEN ColumnID END) AS ColumnID 
    , MIN (CASE x WHEN 0 THEN ColumnValue END) AS ColumnValue 
    , MIN (CASE x WHEN 1 THEN ColumnID END) AS ColumnID_prev 
FROM (
    SELECT ColumnID, ColumnValue, ROW_NUMBER() OVER(ORDER BY ColumnID DESC) AS num 
    FROM TableA 
    WHERE ColumnValue = 100 
) T 
CROSS JOIN (VALUES(0),(1))x(x) 
WHERE num - x > 0 
GROUP BY num - x