2014-09-26 57 views
1

我正在嘗試使用表中的數據,這在我看來有點不完整,我無法弄清楚如何處理這個問題或者如何開始構建問題看看我試圖完成甚至可以使用SQL。這是我正在使用的數據的假想圖(I進入了CSV格式的數據,因爲該文本字段不支持表格格式):用於比較單個表中彼此之間的記錄行的SQL查詢

Date,Time,Traveler,Source,Destination,Travel Status 
9/20/2014,1:00pm,James,Station A,Station B,Scheduled 
9/20/2014,1:10pm,James,Station A,Station B,Traveling 
9/20/2014,1:40pm,James,,Station B,Arrived 
9/20/2014,1:00pm,Ann,Station B,Station A,Scheduled 
9/20/2014,1:10pm,Ann,Station B,Station A,Traveling 
9/20/2014,1:40pm,Ann,,Station A,Arrived 
9/20/2014,1:00pm,Karl,Station A,Station B,Scheduled 
9/20/2014,1:10pm,Karl,Station A,Station B,Traveling 
9/20/2014,1:40pm,Karl,,Station B,Arrived 
9/20/2014,1:00pm,Joyce,Station B,Station A,Scheduled 
9/20/2014,1:10pm,Joyce,Station B,Station A,Traveling 
9/20/2014,1:40pm,Joyce,,Station A,Arrived 
9/20/2014,1:00pm,Kelly,Station B,Station B,Scheduled 
9/20/2014,1:10pm,Kelly,Station B,Station B,Traveling 
9/20/2014,1:40pm,Kelly,,Station B,Arrived 
9/20/2014,1:00pm,Sam,Station A,Station A,Scheduled 
9/20/2014,1:10pm,Sam,Station A,Station A,Traveling 
9/20/2014,1:40pm,Sam,,Station A,Arrived 

我想看看有多少「類型「例如,我們有多少到達的類型,例如A-> A類型的多少到達,B-> B類型的數量以及A-> B和B-> A的數量。

如果數據是這樣的:

Date,Time,Traveler,Source,Destination,Travel Status 
9/20/2014,1:00pm,James,Station A,Station B,Scheduled 
9/20/2014,1:10pm,James,Station A,Station B,Traveling 
9/20/2014,1:40pm,James,Station A,Station B,Arrived 
9/20/2014,1:00pm,Ann,Station B,Station A,Scheduled 
9/20/2014,1:10pm,Ann,Station B,Station A,Traveling 
9/20/2014,1:40pm,Ann,Station B,Station A,Arrived 

這個簡單的查詢將完成此對於每種類型的到來,即對於類型A-> B:

SELECT COUNT(*) FROM TRAVEL_TBL WHERE 
Travel Status = 'Arrived' AND Source = 'Station A' 
AND Destination = 'Station B'; 

但是,由於源字段從包含「到達」條目的記錄中缺少,我如何執行查詢以查找計數?我想唯一的辦法是按順序按時間順序比較每個旅行者對每個旅行者的順序,並跟蹤何時安排行程,如果他們到達並增加此基礎的計數。這是可能使用SQL,還是隻能用Java編寫應用程序,或者使用PHP或任何主機語言來完成邏輯?

回答

2

一個解決方案,與MS SQL 2012+的工作原理是使用LAG()函數來訪問以前行:

SELECT COUNT(*) AS "Count A-B" 
FROM (
    SELECT 
     Date, Time, Traveler, 
     CASE 
      WHEN Source IS NULL THEN LAG(Source,1) OVER (PARTITION BY Date, Traveler ORDER BY Date) 
      ELSE Source 
     END AS Source, 
     Destination, 
     [Travel Status] 
from TRAVEL_TBL) derived_table 
WHERE [Travel Status] = 'Arrived' AND Source = 'Station A' AND Destination = 'Station B'; 

或使用ROW_NUMBER()(這是應該是一個功能更寬泛的版本在大多數主要數據庫中可用)在一個自我加入cte:

;WITH cte AS (
    SELECT 
     Date, Time, Traveler, 
     ROW_NUMBER() OVER (ORDER BY Traveler, Date, Time) rn, 
     Source, 
     Destination, 
     [Travel Status] 
    FROM TRAVEL_TBL 
) 

SELECT COUNT(*) AS "Count A-B" 
FROM (
    SELECT 
     c.Date, c.Time, c.Traveler, 
     CASE 
      WHEN c.Source IS NULL THEN c2.source 
      ELSE c.Source 
     END AS Source, 
     c.Destination, 
     c.[Travel Status] 
    FROM cte c 
    LEFT JOIN cte c2 ON c.rn = c2.rn+1 
) derived_table 
WHERE [Travel Status] = 'Arrived' AND Source = 'Station A' AND Destination = 'Station B'; 
+0

謝謝你。爲了理解這些SQL概念,我有一些工作要做,因爲它們對我來說是新的,但是您已經給了我一個起點,所以我現在知道這是可行的,以及如何解決這個問題。 – rocklandcitizen 2014-10-01 16:28:12

+1

對此進行跟進。查詢工作完美。我在DB2上使用它,必須做一些調整,因爲實際數據與這個例子稍有不同,但我得到了我所需要的。感謝這個解決方案,並幫助我深入瞭解CTE,派生查詢和SQL函數的SQL。 – rocklandcitizen 2014-10-27 20:30:23