powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSSQL найти дубли с выборкой
13 сообщений из 13, страница 1 из 1
MSSQL найти дубли с выборкой
    #39932357
malltaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Есть такая таблица:
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
MSSQL найти дубли с выборкой
    #39932376
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько записей может соответствовать одному BatchName? Поначалу мне показалось, что 2, но дальше похоже, что таки 2N.

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

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

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

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


Читайте про LAG LEAD
...
Рейтинг: 0 / 0
MSSQL найти дубли с выборкой
    #39936945
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
...
Рейтинг: 0 / 0
MSSQL найти дубли с выборкой
    #39936948
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
MSSQL найти дубли с выборкой
    #39936958
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стесняюсь спросить - это зачем?
malltaf
Код: sql
1.
where 1=1

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





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



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

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



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

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


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

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


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

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

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


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

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

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



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

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


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


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

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


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