簡體   English   中英

SQL查詢以比較單個表中彼此之間的記錄行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM