2009-07-01 19 views
3

如何從SELECT語句的前一個結果行中獲取值如何選擇上一行值?

如果我們有一個名爲cardevent的表並且具有行[ID(int),Value(Money)]並且我們有一些行,例如

ID --Value 

1------70 
1------90 
2------100 
2------150 
2------300 
3------150 
3------200 
3-----250 
3-----280 

等等...

如何使一個查詢得到的每一行ID,價值與該數據出現之前的行值如下

ID --- Value ---Prev_Value 

1 ----- 70 ---------- 0 
1 ----- 90 ---------- 70 
2 ----- 100 -------- 90 
2 ------150 -------- 100 
2 ------300 -------- 150 
3 ----- 150 -------- 300 
3 ----- 200 -------- 150 
3 ---- 250 -------- 200 
3 ---- 280 -------- 250 

等。

我提出以下查詢,但它是如此糟糕的業績數據

SELECT cardevent.ID, cardevent.Value, 
     (SELECT F1.Value 
     FROM cardevent as F1 
     where F1.ID = (SELECT Max(F2.ID) 
         FROM cardevent as F2 
         WHERE F2.ID < cardevent.ID) 
    ) AS Prev_Value 
FROM cardevent 

的鉅額因此,誰能幫助我獲得了這樣的問題的最佳解決方案?

+2

爲什麼你標記爲2級不同的RDBMS? – 2009-07-01 07:12:16

+0

複製到這個(其他用戶,其他表名稱):http://stackoverflow.com/questions/742226/how-to-get-a-value-from-previous-result-row-of-a-select-聲明 – MicSim 2009-07-01 07:17:42

+1

必須是一個作業問題.... – 2009-07-01 07:23:47

回答

5

這應該工作的優良兩個數據庫:

SELECT cardevent.ID, cardevent.Value, 
    (SELECT TOP 1 F1.Value 
    FROM cardevent as F1 
    WHERE F1.ID < cardevent.ID 
    ORDER BY F1.ID DESC 
    ) AS Prev_Value 
FROM cardevent 

更新:假設ID不是唯一的,但該ID的組合值是唯一的(您必須指定什麼強制您在桌上訂購,所以人們知道上一行),您必須使用此查詢:

select cardevent.ID, cardevent.Value, 
    (select TOP 1 F1.Value from cardevent as F1 
    where (F1.ID < cardevent.ID) or (F1.ID = cardevent.ID and F1.Value < cardevent.Value) 
    order by F1.ID DESC, F1.Value DESC 
    ) AS Prev_Value 
from cardevent 
2

嘗試這樣:

SELECT C.ID, C.Value, COALESCE(C1.Value, 0) 
FROM cardevent C 
    LEFT JOIN cardevent C1 
    ON C1.Id = (SELECT MAX(id) FROM cardevent C2 where C2.Id < C.Id) 
0

如何執行?

SELECT F1.ID, F1.Value, F3.Value 
FROM cardevent F1 
    INNER JOIN (
     SELECT F1.ID, mID = MAX(F2.ID) 
     FROM cardevent F1 
      INNER JOIN cardevent F2 ON F2.ID < F1.ID 
     GROUP BY F1.ID 
    ) F2 ON F2.id = F1.ID 
    INNER JOIN cardevent F3 ON F3.ID = F2.mID 
UNION ALL 
SELECT F1.ID, F1.Value, 0 
FROM cardevent F1 
    INNER JOIN (
     SELECT ID = MIN(ID) 
     FROM cardevent 
    ) F2 ON F2.ID = F1.ID 
ORDER BY 1 
0

我喜歡TOP 1代替MAX(...),這恕我直言應該也快:

SELECT  C.ID, C.Value, COALESCE(C1.Value, 0) 
FROM  cardevent C 
LEFT JOIN cardevent C1 
     ON C1.ID = (SELECT TOP 1 C2.ID FROM cardevent C2 WHERE C2.ID < C.ID ORDER BY C2.ID)