2015-04-07 63 views
0

我不知道這會被調用,但我只希望獲得特定字段的第一行。然後我想計算行間的時間。在行之間添加時間並只在SQL Server中佔用特定行

在這個例子中,每個病人只有1個狀態1和1個狀態2。這是第一部分。然後,我想結合起來(我想也許一個unpivot的?),並獲得時間差..

Patient Status Time Stamp 
-------------------------- 
A  Status1 22:36:45 
A  Status2 23:04:13 
A  Status2 3:43:13 
B  Status1 10:22:42 
B  Status2 10:32:47 
C  Status1 16:14:30 
C  Status2 16:43:41 
C  Status2 17:22:49 

這是我想

Patient Time Between Status 1&2 
------------------------------- 
A   0:27:28 
B   0:10:05 
C   0:29:11 
+1

如果病人有幾行狀態2行,你如何選擇行? – jarlh

+0

它們是按時間順序排列的 - 所以我需要在狀態1之後出現的第一個。.. –

+0

數據的順序是什麼,您可以指出「......之後的第一個數據」? –

回答

0

使用分析功能FIRST_VALUE and LAG結果:

first_value(time_stamp) OVER(PARTITION BY patient, status ORDER BY time_stamp) first_val 

lag(time_stamp) OVER(PARTITION BY patient ORDER BY status) previos_val 

然後只是得到first_val和previous_val之間的差異。

例子(OracleDB的測試):

SELECT * FROM (
    SELECT patient, status, time_stamp, 
     first_value(time_stamp) 
     OVER(PARTITION BY patient, status ORDER BY time_stamp) first_val, 
     lag(time_stamp) OVER(PARTITION BY patient ORDER BY status) previos_val 
    FROM (
    SELECT 'A' Patient, 'Status1' status, 
     to_date('2015-04-07 22:36:45', 'YYYY-MM-DD HH24:MI:SS') time_stamp 
    FROM dual 
    UNION ALL 
    SELECT 'A' Patient, 'Status2' status, 
     to_date('2015-04-07 23:04:13', 'YYYY-MM-DD HH24:MI:SS') time_stamp 
    FROM dual 
    UNION ALL 
    SELECT 'A' Patient, 'Status2' status, 
     to_date('2015-04-07 3:43:13', 'YYYY-MM-DD HH24:MI:SS') time_stamp 
    FROM dual 
) 
) 
WHERE time_stamp = first_val 
ORDER BY patient, status; 
+0

對不起,我沒有提到這是在2008年。我很確定First Value是2012年 –

0

您可以使用ROW_NUMBER()來獲取狀態1.

SELECT A.Patient 
,CONVERT(varchar(8),CAST(B.TimeStamp as DATETIME)-CAST(A.TimeStamp as DATETIME),8) as Time 
FROM yourtable A 
JOIN 
(
    SELECT Patient,TimeStamp 
    ,ROW_NUMBER() over(partition by Patient ORDER BY Status) as ROWID 
    FROM yourtable WHERE Status='Status2' 
) B 
ON A.Patient=B.Patient AND B.ROWID=1 
WHERE A.Status='Status1' 
ORDER BY A.Patient 

輸出

後到來的狀態2行
Patient Time 
A  00:27:28 
B  00:10:05 
C  00:29:11 
0

只要做一個簡單的GROUP BY,並計算差異

select Patient, 
     min(case when Status = 'Status2' then timestamp end) - 
      min(case when Status = 'Status1' then timestamp end) 
from tablename 
group by patient 

請注意,我不知道MS SQL Server的,所以你可能需要調整時差計算:(第一)狀態2和(第一)狀態1之間erence。 (看看其他答案!)