Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSSQL найти дубли с выборкой / 13 сообщений из 13, страница 1 из 1
28.02.2020, 18:44
    #39932357
malltaf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
Всем привет.
Есть такая таблица:
IdEventLogIdEventLogDateBatchNameEventTypeUserNameRoleNameDetailsVerificationResultBatchIdTaskIdWorkstation405461811354323942020-02-28 17:48:29.000CRB2020280217150603_1Comleted taskipugacheva2Старший оператор ЦВПNULLSAVE_AND_FORWARD117414174736352SRVTE298405461711354323792020-02-28 17:48:28.000CRB2020280217225632_1Received taskoryazepovaОператор ЦВП расширенныйПолучение задания пользователемNULL117414324736382SRVTE297405461611354323602020-02-28 17:48:26.000CRB2020280216560813_1Comleted taskoryazepovaОператор ЦВП расширенныйNULLSAVE_AND_FORWARD117414214736355SRVTE297405461511354323082020-02-28 17:48:11.000CRB2020280217175055_1Canceled taskymikheeva2Оператор ЦВПNULLNULL117414284736362SRVTE296405461411354322462020-02-28 17:47:58.000CRB2020280217082625_1Received taskeluzinaОператор ЦВППолучение задания пользователемNULL117414294736378SRVTE296405461311354320272020-02-28 17:47:24.000CRB2020280216230826_4Received taskoyukhimetsСтарший оператор ЦВППолучение задания пользователемNULL117414304736377SRVTE295405461211354320132020-02-28 17:47:21.000CRB2020280216554384_2Comleted taskoyukhimetsСтарший оператор ЦВПNULLSAVE_AND_FORWARD117414114736329SRVTE295
У номеров BatchName существует три события EventType: Received, Canceled, Comleted (да, тут пропущена буква). Мне нужно понять, были ли у каких-нибудь номеров дублирующие назначения (Received task).
Примеры.
Корректная ситуация:
EventLogDateBatchNameEventTypeUserName2020-02-28 07:56:38.000WPS2020260218521199_1Received tasksshmeleva22020-02-28 07:57:02.000WPS2020260218521199_1Canceled tasksshmeleva22020-02-28 09:48:45.000WPS2020260218521199_1Received taskyeremina2020-02-28 09:50:11.000WPS2020260218521199_1Comleted taskyeremina
Корректная ситуация:
EventLogDateBatchNameEventTypeUserName2020-02-28 12:55:27.000EUR2020280212384237_1Received taskoguryleva2020-02-28 12:58:01.000EUR2020280212384237_1Comleted taskoguryleva2020-02-28 13:01:49.000EUR2020280212414737_1Received taskivolkova22020-02-28 13:03:28.000EUR2020280212414737_1Canceled taskivolkova22020-02-28 13:03:30.000EUR2020280212414737_1Received taskegureva2020-02-28 13:06:52.000EUR2020280212414737_1Comleted taskegureva

Некорректная ситуация:
EventLogDateBatchNameEventTypeUserName2020-02-28 17:23:17.000CRB2020280216535440_1Received taskivolkova22020-02-28 17:24:52.000CRB2020280216535440_1Received taskadasaeva22020-02-28 17:26:33.000CRB2020280216535440_1Comleted taskadasaeva2
В данном случае дважды получили Received task, что говорит о какой-то ошибке в программе.

На данный момент осуществляю поиск таких BatchName следующим скриптом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select * from (
select pe.BatchName, count(*) as PP1 from ProcessLog pe
where 1=1
and  pe.EventType = 'Received task'
and pe.EventLogDate >= DATEADD(HOUR, -24, GETDATE())
group by pe.BatchName
having count(pe.BatchName) >1) p1, 
(select pe.BatchName, count(*) as PP2 from ProcessLog pe
where 1=1
and  (pe.EventType = 'Comleted task' or pe.EventType = 'Canceled task')
and pe.EventLogDate >= DATEADD(HOUR, -24, GETDATE())
group by pe.BatchName
having count(pe.BatchName) >1 )  p2
where p1.BatchName = p2.BatchName
and abs(pp1-pp2) > 1


Но выглядит это довольно отвратно и не факт, что во всех случаях правильно сработает.
Как можно сделать скрипт более элегантным и лаконичным (или переделать), чтобы при этом выдавал требуемое?
Спасибо.
...
Рейтинг: 0 / 0
28.02.2020, 19:33
    #39932376
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
Сколько записей может соответствовать одному BatchName? Поначалу мне показалось, что 2, но дальше похоже, что таки 2N.

Некорректная ситуация - возможно ли Canceled либо Comleted без Received? в смысле - бывает ли на практике?

Если действительно 2N - бывает ли 2 Received, и только потом парные им Canceled либо Comleted? Это - корректно или нет?

Обязательно ли в комплекте иметь пару с совпадающим UserName?
...
Рейтинг: 0 / 0
28.02.2020, 19:43
    #39932382
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
malltaf

Но выглядит это довольно отвратно и не факт, что во всех случаях правильно сработает.
Как можно сделать скрипт более элегантным и лаконичным (или переделать), чтобы при этом выдавал требуемое?
Спасибо.


Читайте про LAG LEAD
...
Рейтинг: 0 / 0
13.03.2020, 10:26
    #39936945
malltaf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
Всем спасибо. Забыл отписаться, к чему пришел.
Создал дополнительную таблицу и хранимую процедуру с следующим содержанием:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
DECLARE @BatchName nvarchar(max)
DECLARE BATCH_CURSOR CURSOR
  LOCAL STATIC READ_ONLY FORWARD_ONLY  
FOR 
SELECT DISTINCT BatchName 
FROM ProcessLog
WHERE EventLogDate >= DATEADD(MINUTE, -10, GETDATE())

OPEN BATCH_CURSOR
FETCH NEXT FROM BATCH_CURSOR INTO @BatchName

WHILE @@FETCH_STATUS = 0
BEGIN 
	with eventdup as (
			select pe.eventlogdate, pe.BatchName, pe.EventType,
			LEAD(pe.EventType) OVER (ORDER BY pe.BatchName, pe.EventLogDate) nexxt
			from ProcessLog pe
			where 1=1
			and pe.BatchName = @BatchName
	)
	insert into dbo.DuplicateBatch
	select *
	from eventdup
	where EventType = nexxt
	and EventType like '%eceive%'
	order by BatchName

    FETCH NEXT FROM BATCH_CURSOR INTO @BatchName
END
--select eventlogdate, BatchName  from dbo.DuplicateBatch
CLOSE BATCH_CURSOR
DEALLOCATE BATCH_CURSOR
...
Рейтинг: 0 / 0
13.03.2020, 10:32
    #39936948
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
malltaf
Всем спасибо. Забыл отписаться, к чему пришел.
Создал дополнительную таблицу и хранимую процедуру с следующим содержанием:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
DECLARE @BatchName nvarchar(max)
DECLARE BATCH_CURSOR CURSOR
  LOCAL STATIC READ_ONLY FORWARD_ONLY  
FOR 
SELECT DISTINCT BatchName 
FROM ProcessLog
WHERE EventLogDate >= DATEADD(MINUTE, -10, GETDATE())

OPEN BATCH_CURSOR
FETCH NEXT FROM BATCH_CURSOR INTO @BatchName

WHILE @@FETCH_STATUS = 0
BEGIN 
	with eventdup as (
			select pe.eventlogdate, pe.BatchName, pe.EventType,
			LEAD(pe.EventType) OVER (ORDER BY pe.BatchName, pe.EventLogDate) nexxt
			from ProcessLog pe
			where 1=1
			and pe.BatchName = @BatchName
	)
	insert into dbo.DuplicateBatch
	select *
	from eventdup
	where EventType = nexxt
	and EventType like '%eceive%'
	order by BatchName

    FETCH NEXT FROM BATCH_CURSOR INTO @BatchName
END
--select eventlogdate, BatchName  from dbo.DuplicateBatch
CLOSE BATCH_CURSOR
DEALLOCATE BATCH_CURSOR



А слабо прочитать про PARTITION BY и избавиться от курсора?
...
Рейтинг: 0 / 0
13.03.2020, 10:55
    #39936958
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
Стесняюсь спросить - это зачем?
malltaf
Код: sql
1.
where 1=1

...
Рейтинг: 0 / 0
13.03.2020, 10:55
    #39936959
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
SQL2008
Стесняюсь спросить - это зачем?
malltaf
Код: sql
1.
where 1=1





для удобства добавления/удаления условий в where
...
Рейтинг: 0 / 0
13.03.2020, 11:01
    #39936962
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
msLex
SQL2008
Стесняюсь спросить - это зачем?
пропущено...



для удобства добавления/удаления условий в where

хм... т.е. не задумываться ставить ли "and " перед условием или нет?
...
Рейтинг: 0 / 0
13.03.2020, 11:04
    #39936964
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
SQL2008
msLex
пропущено...



для удобства добавления/удаления условий в where

хм... т.е. не задумываться ставить ли "and " перед условием или нет?


легко комментируется/раскомментируется любое условие через and

стандартная "проблема" оформления "списков", когда 1-я или последняя запись отличается от остальных.
...
Рейтинг: 0 / 0
13.03.2020, 11:05
    #39936965
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
впрочем в коде, который я обслуживаю мне тоже попалось условие в MERGE
Код: sql
1.
WHERE 1 = 0


Что вызвало деградацию запроса в обычный INSERT.

Хорошо, что эти люди не работает поварами, докторами и пожарными.
...
Рейтинг: 0 / 0
13.03.2020, 11:07
    #39936966
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
msLex
SQL2008
пропущено...

хм... т.е. не задумываться ставить ли "and " перед условием или нет?


легко комментируется/раскомментируется любое условие через and

стандартная "проблема" оформления "списков", когда 1-я или последняя запись отличается от остальных.

Да, это понятно.
Правда никогда этим не пользовался.
...
Рейтинг: 0 / 0
13.03.2020, 11:23
    #39936973
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
SQL2008
впрочем в коде, который я обслуживаю мне тоже попалось условие в MERGE
Код: sql
1.
WHERE 1 = 0



Что вызвало деградацию запроса в обычный INSERT.

Хорошо, что эти люди не работает поварами, докторами и пожарными.


Такие "фокусы" делают для доступа в output к полям, которых нет в "таблице" inserted.


В merge это возможно, в insert - нет.
...
Рейтинг: 0 / 0
13.03.2020, 12:13
    #39937019
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL найти дубли с выборкой
msLex
Такие "фокусы" делают для доступа в output к полям, которых нет в "таблице" inserted.
В merge это возможно, в insert - нет.

Странно...
Официальная документация имеет на этот счет иное мнение
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSSQL найти дубли с выборкой / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]