2015-10-06 3 views
0

Я пытаюсь создать простой запрос и кажется, что я застрял здесь ... У меня есть таблица с сообщениями об ошибках журнала:Сделать запрос SQL, чтобы найти повторяющиеся сообщения

id | userID | errorCode | errorRef | date | message 

Когда я сделать некоторую последовательность действий, все они ссылаются на тот же errorRef, но с другим кодом ошибки.

Мне нужно найти всех пользователей, которые испытали код «400» в качестве последней ошибки в последовательности (по дате) и получили ее в последовательности с несколькими последовательностями (более 2).

Например, я должен найти идентификатор пользователя = 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, на которой было как минимум 2 экземпляра этого события.

Я добавил дополнительный пользовательский идентификатор, чтобы показать, что он работает так, как ожидалось.

+0

Это именно то, что я необходимо. Спасибо! – Max

+0

Нет проблем. Надеюсь, никто не теряет работу, потому что я дал вам решение;) –