powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка по сложному условию
8 сообщений из 8, страница 1 из 1
Группировка по сложному условию
    #39675432
PyotrL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Гуру форума, прошу помощи:)
Вот уже несколько дней не могу придумать скрипт для следующих задач:
В таблице есть поля: Date (type: datetime), Payer, Receiver, Amount,...
1. Нужно вывести все строки, для которых существует строка с теми же значениями Payer, Receiver и разницей в Date не более 24-х часов.
2. То же самое, но у строки должно быть > 1 совпадения по Payer, Receiver.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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 
...
Рейтинг: 0 / 0
Группировка по сложному условию
    #39675435
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PyotrL1. Нужно вывести все строки, для которых существует строка с теми же значениями Payer, Receiver и разницей в Date не более 24-х часов.Существует по-английски - exists. Вот в сторону EXISTS-подзапроса и смотрите.
PyotrL2. То же самое, но у строки должно быть > 1 совпадения по Payer, Receiver.тоже самое, но в EXISTS-подзапросе - группировка и HAVING.

Либо, как универсальный вариант на оба случая - [CROSS | OUTER] APPLY-подзапрос с нужно логикой внутри
...
Рейтинг: 0 / 0
Группировка по сложному условию
    #39675439
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1
Код: sql
1.
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)


2
Код: sql
1.
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)
...
Рейтинг: 0 / 0
Группировка по сложному условию
    #39675443
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court1
Код: sql
1.
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)


2
Код: sql
1.
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)


дай угадаю: выдаст все записи
...
Рейтинг: 0 / 0
Группировка по сложному условию
    #39675444
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKcourt1
Код: sql
1.
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)



2
Код: sql
1.
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
...
Рейтинг: 0 / 0
Группировка по сложному условию
    #39675566
PyotrL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, спасибо за ответ!
как результат получу, отпишусь:)
...
Рейтинг: 0 / 0
Группировка по сложному условию
    #39675840
PyotrL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз мерси, результат дает нужный, на базе 60 млн. отрабатывает за 2 часа.
...
Рейтинг: 0 / 0
Группировка по сложному условию
    #39676079
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PyotrLна базе 60 млн. отрабатывает за 2 часа.
Индексы?

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


Код: sql
1.
SELECT DATEDIFF( HOUR, '2018-07-18 00:00:00', '2018-07-19 00:59:00' )


Я бы порекомендовал превратить условие в диапазон
Код: sql
1.
2.
    t2.[date] >= DATEADD( HOUR, -24, t1.[date] )
AND t2.[date]  < DATEADD( HOUR,  24, t1.[date] )
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Группировка по сложному условию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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