2017-08-04 20 views
0

我是一名SQL初學者。在問我確切的問題之前,我想簡要介紹一下情況,只是爲了闡明正確的背景。如何使用T-SQL過濾大量數據,然後處理結果組?

我有一個大表,其中包含每次電子令牌創建,更新或關閉時的記錄。表的主鍵是「歷史ID」,每個標記都有一個令牌號,它在一天的開始時被回收(即帶有令牌號的單個令牌,例如15不能在相同的時間內打開,關閉然後重新打開天)。

下面是該表的快照。如您所見,創建Token No 940(狀態ID = 1),然後更新爲各種狀態(2,3,4),然後關閉(10)。之後,隨着日子開放,940有更多的記錄。

╔═════════════════╦══════════╦═══════════╦═════════════════════════╗ 
║ History ID (PK) ║ Token ID ║ Status ID ║ Status Updated On ║ 
╠═════════════════╬══════════╬═══════════╬═════════════════════════╣ 
║   13435 ║  953 ║   1 ║ 2013-01-24 16:20:26.957 ║ 
║   13436 ║  940 ║   1 ║ 2013-01-24 16:20:22.090 ║ 
║   13437 ║  939 ║   3 ║ 2013-01-24 16:20:30.290 ║ 
║   13438 ║  939 ║   5 ║ 2013-01-24 16:21:07.387 ║ 
║   13439 ║  940 ║   2 ║ 2013-01-24 16:21:09.000 ║ 
║   13440 ║  940 ║   3 ║ 2013-01-24 16:23:14.510 ║ 
║   13441 ║  940 ║   4 ║ 2013-01-24 16:23:15.860 ║ 
║   13442 ║  940 ║  10 ║ 2013-01-24 16:23:30.013 ║ 
║   13443 ║  938 ║   2 ║ 2013-01-24 16:23:31.657 ║ 
╚═════════════════╩══════════╩═══════════╩═════════════════════════╝ 

我需要能夠通過它們關聯的標記將記錄組合​​在一起。我看到它的方式,這意味着我需要先白過濾記錄,然後我可以通過令牌編號過濾結果,爲每個令牌編號和每天提供一組記錄。然後,我可以執行我需要的計算,例如平均從一種狀態更改爲另一種狀態的時間,或繪製令牌保持打開狀態的持續時間。

我不知道如何做到這一點,任何幫助將不勝感激。我猜想對於一個有經驗的SQL開發人員來說,這樣的問題相當簡單嗎?

感謝提前:)

+0

你只需要'SELECT COUNT(HistoryID).. FROM歷史GROUP BY TokenID,CAST(StatusUpdatedOn as DATE)'...?我認爲你至少應該加上你想要的結果,以及你到目前爲止所嘗試過的結果。 –

+0

我可以推薦www.sqlzoo.net作爲一個優秀的初學者 - >中級SQL教程網站。祝你好運。 – JeffUK

+0

LEAD()分析函數將用於計算狀態更改之間時間的差異。這會給你所需的平均時間,確定時間開放等。日期的最小()/最大()()會給你每個令牌的開放和關閉時間(假設是最短的,最近的時間是開放的如果不是的話,我們可以使用分析函數和case語句來解決這個問題,但是這裏沒有具體的問題,請提供一些預期的結果以及您嘗試過的結果,我們可以從這裏開始。 – xQbert

回答

0

只需使用一個簡單的CTE或公共表表達式來選擇令牌今天一天說,然後你可以基於CTE

with temp as 
    (
    select token id ,count(1) as cnt 
    from table 
    where status date = getdate() 
    group by token id 
    ) 
<do the operations here > 

做業務如果表是非常巨大的CTE可能有點slower.In這種情況下,把過濾後的結果爲一個表像下面

 select token id ,count(1) as cnt 
    into #temp 
    from table 
    where status date = getdate() 
    group by token id 
0
WITH CTE1 
AS 
(SELECT History ID, MAX(Token ID), MAX(Status ID), Status Updated On 
FROM Table 
GROUP BY History ID, Status Updated On) 
/* Status Updated On looks like a DateTime, so if you're grouping by date 
you'll want to do CONVERT(DATE, Status Updated On) in the GROUP BY */ 

SELECT * FROM CTE1 
/* Choose the calculations, aggregations or arithmetic operations you need 
to do here with CTE1. Important note, you are now selecting from 
CTE1.Column*/ 

希望這對您有幫助或足以幫助您開始!

編輯:我重讀你的問題,它看起來像你的令牌ID,而不是歷史ID試圖組(我想?)

WITH CTE1 
AS 
(SELECT MAX(History ID), Token ID, MAX(Status ID), Status Updated On 
FROM Table 
GROUP BY Token ID, Status Updated On) 

SELECT * FROM CTE1