2014-03-05 72 views
0

我知道我的問題不是來自它的標題清楚,但我被困在複雜的情況下 我的表輸出是SQL查詢來獲取前行比較時根據其他列

+----+-------------+-----------+-------------------------+-------------------------+ 
| Id | personCount | StatusId |  MinStartTime  |  MinEndTime  | 
+----+-------------+-----------+-------------------------+-------------------------+ 
| 1 | 3   | 1   | 2014-02-20 07:03:50.137 | 2014-02-20 07:38:33.400 | 
| 2 | 3   | 8   | 2014-02-20 07:13:08.327 | 2014-02-20 07:21:28.697 | 
| 3 | 3   | 2   | 2014-02-20 07:25:06.257 | 2014-02-20 07:47:32.507 | 
| 4 | 4   | 1   | 2014-02-20 07:38:33.400 | 2014-02-20 12:03:03.550 | 
| 5 | 4   | 2   | 2014-02-20 07:47:32.507 | 2014-02-20 08:02:10.707 | 
| 6 | 4   | 8   | 2014-02-20 08:16:32.370 | 2014-02-20 11:11:02.900 | 
| 7 | 4   | 8   | 2014-02-20 11:52:12.777 | 2014-02-20 12:03:03.550 | 
| 8 | 0   | 1   | 2014-02-20 12:03:03.550 | 2014-02-21 05:22:45.287 | 
| 9 | 2   | 1   | 2014-02-21 05:22:45.303 | 2014-02-25 10:47:22.590 | 
+----+-------------+-----------+-------------------------+-------------------------+ 

現在,如果你看一下在Id = 4行,其狀態爲1,前一行id = 3狀態爲2. 由於第三行是Endtime大於第四行開始時間

所以我想比較第四行的人數與它的前一行的狀態ID是1即。身份證= 1,如果人數少於我想更新人數= 4行人數爲4-3即。 1

希望我已經很容易理解。

現在我可以得到上一行與自聯接和比較值,但隨後我怎麼可以比較其以前的一行值,其中狀態ID爲1

查詢我使用來獲得上一行在這種情況下

select tnext.Id,tnext.personCount 
from @TableDataStatus t join 
    @TableDataStatus tnext 
    on t.id = tnext.id - 1 and 
     t.StatusId = 2 and 
     tnext.StatusId = 1 and 
     CONVERT(char(16),tnext.MinStartTime,120)<CONVERT(char(16),t.MinEndTime,120) 

將返回我的ID = 4這是現在我如何與上一行與狀態ID = 1

+3

我看了你的解釋幾次,但它是非常混亂。你能解釋一下這項手術試圖完成什麼嗎? – Seano666

+1

除了@ Seano666請求之外,如果您可以發佈此示例輸入的示例輸出,它將有助於使事情更清晰。 – Mureinik

+0

你爲什麼要把datetime轉換爲char? – Rodion

回答

0

比較下面的自聯接查詢過的ID會列出當前行和前一行側方

select * 
from @TableDataStatus curr 
left join @TableDataStatus prev on curr.id = prev.id + 1 

但是其他條件(如StatusId或datetime列上的條件)會阻止爲每個當前數據查找以前的數據行。

例如下面的代碼與它之前的第3行只返回第4行

select * 
from MyTables curr 
left join MyTables prev on curr.id = prev.id + 1 
where 
    prev.StatusId = 2 and 
    curr.StatusId = 1 and 
    curr.MinStartTime < prev.MinEndTime 

如果第四行是唯一的目標,那麼你可以測試以下UPDATE語句

UPDATE MyTables 
SET 
    personCount = MyTables.personCount - prev.personCount 
from MyTables 
left join MyTables prev on MyTables.id = prev.id + 1 
where 
    prev.StatusId = 2 and 
    MyTables.StatusId = 1 and 
    MyTables.MinStartTime < prev.MinEndTime