I'm trying to get a previous value from within a result set.
I have a table 'TableA' which looks like this -

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

I get the following resultset using this query -

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

ColumnID    ColumnValue

7           100         
6           100         
1           100 

Now I need to add one more column to the resultset I have(previous query), which gives the previous ColumnID from "WITHIN" the existing result set.
I mentioned within the resultset, because the ColumnID does not follow any order. Like in this case it goes from 7, 6 and then straight to 1.

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

Any Help? I use SQL Server 2008

有帮助吗?

解决方案

This is slightly convoluted but it seems to work:

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

Here's a complete test script:

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

其他提示

Use a fake ordering column 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top