2016-10-03 44 views
-1

我的源表中有這種類型的數據。需要顯示具有不同條件的一行中的下一行數據

site    date_time  data 
1016771  2016-06-04 00:00:00 LBV 
1016771  2016-06-04 00:00:00  SOB 
1016771  2016-06-04 01:29:00  LBV 
1016771  2016-06-04 01:29:00  SOB 
1016771  2016-06-04 05:51:00  SOB 
1016771  2016-06-04 05:51:00  LBV 
1016771  2016-06-04 08:35:00  SOB 
1016771  2016-06-04 08:35:00  LBV 
1016771  2016-06-04 11:18:00  LBV 
1016771  2016-06-04 11:18:00  SOB 
1016771  2016-06-04 12:20:00  LBV 
1016771  2016-06-04 12:20:00  SOB 
1016771  2016-06-04 13:24:00  LBV 
1016771  2016-06-04 13:24:00  SOB 
1016771  2016-06-04 14:04:00  LBV 
1016771  2016-06-04 14:04:00  SOB 
1016771  2016-06-04 15:27:00  LBV 
1016773  2016-06-04 15:27:00  SOB 
1016773  2016-06-04 16:55:00  LBV 
1016773  2016-06-04 16:55:00  SOB 
1016773  2016-06-04 18:15:00  LBV 
1016773  2016-06-04 18:15:00  SOB 

現在我想對這個數據模型執行一些操作。我希望下一行數據在同一行。 輸出是這樣的:

site   SOB_date_time    LBV_date_time 
1016771  2016-06-04 00:00:00   2016-06-04 01:29:00  
1016771  2016-06-04 05:51:00   2016-06-04 05:51:00 
1016771  2016-06-04 08:35:00   2016-06-04 08:35:00  
1016771  2016-06-04 11:18:00   2016-06-04 12:20:00  
1016771  2016-06-04 12:20:00   2016-06-04 13:24:00  
1016771  2016-06-04 13:24:00   2016-06-04 14:04:00  
1016771  2016-06-04 14:04:00   2016-06-04 15:27:00 
1016773  2016-06-04 15:27:00   2016-06-04 16:55:00 
1016773  2016-06-04 16:55:00   2016-06-04 18:15:00  

你可以幫我解決這個問題。

+0

你已經試過了什麼? – Tikkes

+0

我試圖用鉛和滯後分析功能來解決這個問題。但我沒有得到優化輸出 –

回答

2

如果你只拿到了2個不同data是你可以使用OUTER APPLY:

SELECT y.[site], 
     y.date_time as SOB_date_time, 
     t.date_time as LBV_date_time 
FROM YourTable y 
OUTER APPLY (
    SELECT TOP 1 * 
    FROM YourTable 
    WHERE y.[site] = [site] 
     AND y.date_time < date_time 
     AND [data] = 'LBV' 
    ORDER BY date_time 
) as t 
WHERE y.[data] = 'SOB' 

輸出:

site SOB_date_time  LBV_date_time 
1016771 2016-06-04 00:00:00 2016-06-04 01:29:00 
1016771 2016-06-04 01:29:00 2016-06-04 05:51:00 
1016771 2016-06-04 05:51:00 2016-06-04 08:35:00 
1016771 2016-06-04 08:35:00 2016-06-04 11:18:00 
1016771 2016-06-04 11:18:00 2016-06-04 12:20:00 
1016771 2016-06-04 12:20:00 2016-06-04 13:24:00 
1016771 2016-06-04 13:24:00 2016-06-04 14:04:00 
1016771 2016-06-04 14:04:00 2016-06-04 15:27:00 
1016773 2016-06-04 15:27:00 2016-06-04 16:55:00 
1016773 2016-06-04 16:55:00 2016-06-04 18:15:00 
1016773 2016-06-04 18:15:00 NULL 

一個多用TOP 1的聯繫和ROW_NUMBER()方法

SELECT TOP 1 WITH TIES 
     y.[site], 
     y.date_time as SOB_date_time, 
     y1.date_time as LBV_date_time 
FROM YourTable y 
LEFT JOIN YourTable y1 
    ON y.[site] = y1.[site] and y1.[data] = 'LBV' AND y.date_time < y1.date_time 
WHERE y.[data] = 'SOB' 
ORDER BY ROW_NUMBER() OVER (PARTITION BY y.[site],y.date_time ORDER BY y1.date_time) 
+0

獲得完全相同的輸出,你想要的主要問題 - 你需要一些代表行的順序的id字段。 – gofr1

+0

我在Vertica軟件中執行查詢。 OUTER APPLY在vertica中不起作用。是否有其他解決方案。我們可以使用先導和滯後分析功能來解決這個問題嗎? –

+0

我添加TOP 1 WITH TIES和訂購的解決方案,應該給出相同的結果 – gofr1

相關問題