Question

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

Was it helpful?

Solution

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

OTHER TIPS

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top