[英]SQL Query to compare record rows between each other in single table
我正在嘗試使用我認為有些不完整的表中的數據,而且我無法弄清楚如何解決該問題或如何開始構建問題以查看我嘗試完成的任務是否甚至可以使用SQL 。 這是我正在使用的數據的假設表示(我以CSV格式輸入數據,因為此文本字段不支持表格格式):
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或任何宿主語言來編寫應用程序來完成邏輯?
與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';
或者在帶有自連接的cte中使用ROW_NUMBER()(這是大多數主要數據庫中應該使用的功能)的更通用版本:
;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';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.