2015-10-06 65 views
0

我試圖創建一個簡單的查詢,似乎我堅持在這裏...... 我有錯誤日誌信息表:做一個SQL查詢來查找重複的消息

id | userID | errorCode | errorRef | date | message 

當我做一些序列它們都引用相同的errorRef,但具有不同的errorCode。

我需要找到所有經歷過代碼「400」的用戶作爲序列中的最後一個錯誤(按日期),並以乘法序列(超過2)獲得它。

舉例來說,我應該找用戶id = 1,如果有這樣的記錄:

1 | 1 | 333 | 127000 | 2015-10-06 00:00:00 | pressed the Start 
3 | 1 | 334 | 127001 | 2015-10-06 00:01:02 | click Cancel 
2 | 1 | 400 | 127000 | 2015-10-06 00:00:01 | gets an error 
3 | 1 | 333 | 127001 | 2015-10-06 00:01:01 | pressed the Start 
3 | 1 | 335 | 127001 | 2015-10-06 00:01:02 | click Yes 
3 | 1 | 400 | 127001 | 2015-10-06 00:01:03 | gets an error 
3 | 1 | 333 | 127011 | 2015-10-06 00:01:01 | pressed the Start 
3 | 1 | 336 | 127011 | 2015-10-06 00:01:02 | click No 
3 | 1 | 400 | 127011 | 2015-10-06 00:01:03 | gets an error 

我知道這是簡單的查詢,但我堅持了很長的時間與它....謝謝

編輯: 爲了更清楚。我希望它會。有一個客戶服務軟件。一些客戶服務顧問在發生錯誤後不做任何事情。他們必須繼續處理客戶請求。他們中的一些人,其中一些人沒有。我需要找到那些停止處理這個特定錯誤的請求超過兩次。 對不起,第一次沒有描述它。

+0

這是一個很好的開始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

與僅發現有兩次錯誤400的用戶有什麼不同? 「順序」是指什麼? –

+0

「400」可能不是最後一個消息的順序。序列在一個訂單內執行。客戶服務軟件用戶創建訂單(orderID = errorRef),並且所有消息都將鏈接到它。 – Max

回答

1
CREATE TABLE Table1 
    ([id] int, [userID] int, [errorCode] int, [errorRef] int, [date] datetime, [message] varchar(17)) 
; 

INSERT INTO Table1 
    ([id], [userID], [errorCode], [errorRef], [date], [message]) 
VALUES 
    (1, 1, 333, 127000, '2015-10-06 00:00:00', 'pressed the Start'), 
    (3, 1, 334, 127001, '2015-10-06 00:01:02', 'click Cancel'), 
    (2, 1, 400, 127000, '2015-10-06 00:00:01', 'gets an error'), 
    (3, 1, 333, 127001, '2015-10-06 00:01:01', 'pressed the Start'), 
    (3, 1, 335, 127001, '2015-10-06 00:01:02', 'click Yes'), 
    (3, 1, 400, 127001, '2015-10-06 00:01:03', 'gets an error'), 
    (3, 1, 333, 127011, '2015-10-06 00:01:01', 'pressed the Start'), 
    (3, 1, 336, 127011, '2015-10-06 00:01:02', 'click No'), 
    (3, 1, 400, 127011, '2015-10-06 00:01:03', 'gets an error'), 
    (3, 2, 400, 127012, '2015-10-06 00:01:03', 'gets an error') 
; 

;WITH CTE AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY UserID, ErrorRef ORDER BY Date DESC) AS RN 
FROM Table1) 
SELECT UserId 
FROM CTE 
WHERE RN = 1 AND ErrorCode = '400' 
GROUP BY UserId 
HAVING COUNT(*) > 1 

我似乎理解你的要求。您需要所有在該訂單中最後一條已知消息出現錯誤400的用戶,這些用戶至少有兩次發生這種情況。

我添加了一個額外的用戶ID只是爲了顯示它按預期工作。

+0

這正是我需要。謝謝! – Max

+0

沒問題。我希望沒有人失去工作,因爲我給了你一個解決方案;) –