Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Группировка по сложному условию  [new]
PyotrL
Member

Откуда:
Сообщений: 3
Добрый день!
Гуру форума, прошу помощи:)
Вот уже несколько дней не могу придумать скрипт для следующих задач:
В таблице есть поля: Date (type: datetime), Payer, Receiver, Amount,...
1. Нужно вывести все строки, для которых существует строка с теми же значениями Payer, Receiver и разницей в Date не более 24-х часов.
2. То же самое, но у строки должно быть > 1 совпадения по Payer, Receiver.

Задачу немного проще, где нужно просто найти больше двух совпадений по Date, Payer, Receiver (в базе за июнь 2018), решил след образом:

SELECT  
		Date, Payer, Receiver, 
		
	FROM 
	(SELECT *, COUNT(*)
	OVER(Partition by 
	Date, PAYER, RECEIVER) as count 

	from dbo xx 
	where (xx.count>2 AND 
	YEAR(Date)=2018 AND 
	    	      MONTH(Date)=6 
18 июл 18, 09:44    [21580041]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по сложному условию  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
PyotrL
1. Нужно вывести все строки, для которых существует строка с теми же значениями Payer, Receiver и разницей в Date не более 24-х часов.
Существует по-английски - exists. Вот в сторону EXISTS-подзапроса и смотрите.
PyotrL
2. То же самое, но у строки должно быть > 1 совпадения по Payer, Receiver.
тоже самое, но в EXISTS-подзапросе - группировка и HAVING.

Либо, как универсальный вариант на оба случая - [CROSS | OUTER] APPLY-подзапрос с нужно логикой внутри
18 июл 18, 09:55    [21580066]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по сложному условию  [new]
court
Member

Откуда:
Сообщений: 1956
1
select * from T t1 
where exists (select 1 from T t2 where t1.Payer=t2.Payer and t1.Receiver=t2.Receiver and abs(datediff(hour,t1.Date,t2.Date))<=24)

2
select * from T t1 
where exists (select 1 from T t2 where t1.Payer=t2.Payer and t1.Receiver=t2.Receiver and abs(datediff(hour,t1.Date,t2.Date))<=24 having count(*)>=2)
18 июл 18, 09:58    [21580081]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по сложному условию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
court
1
select * from T t1 
where exists (select 1 from T t2 where t1.Payer=t2.Payer and t1.Receiver=t2.Receiver and abs(datediff(hour,t1.Date,t2.Date))<=24)

2
select * from T t1 
where exists (select 1 from T t2 where t1.Payer=t2.Payer and t1.Receiver=t2.Receiver and abs(datediff(hour,t1.Date,t2.Date))<=24 having count(*)>=2)

дай угадаю: выдаст все записи
18 июл 18, 10:02    [21580091]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по сложному условию  [new]
court
Member

Откуда:
Сообщений: 1956
TaPaK
court
1
select * from T t1 
where exists (select 1 from T t2 where t1.Payer=t2.Payer and t1.Receiver=t2.Receiver and abs(datediff(hour,t1.Date,t2.Date))<=24)


2
select * from T t1 
where exists (select 1 from T t2 where t1.Payer=t2.Payer and t1.Receiver=t2.Receiver and abs(datediff(hour,t1.Date,t2.Date))<=24 having count(*)>=2)


дай угадаю: выдаст все записи
ага :)

ТС, еще в подзапросе условие нужно добавить t1.PK<>t2.PK
18 июл 18, 10:03    [21580095]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по сложному условию  [new]
PyotrL
Member

Откуда:
Сообщений: 3
court, спасибо за ответ!
как результат получу, отпишусь:)
18 июл 18, 12:17    [21580574]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по сложному условию  [new]
PyotrL
Member

Откуда:
Сообщений: 3
Еще раз мерси, результат дает нужный, на базе 60 млн. отрабатывает за 2 часа.
18 июл 18, 18:57    [21582301]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по сложному условию  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
PyotrL
на базе 60 млн. отрабатывает за 2 часа.

Индексы?

Почитайте в BOL о специфическом поведении DATEDIFF
abs(datediff(hour,t1.Date,t2.Date))<=24

SELECT DATEDIFF( HOUR, '2018-07-18 00:00:00', '2018-07-19 00:59:00' )

Я бы порекомендовал превратить условие в диапазон
    t2.[date] >= DATEADD( HOUR, -24, t1.[date] )
AND t2.[date]  < DATEADD( HOUR,  24, t1.[date] )
19 июл 18, 10:27    [21583926]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить