Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите с запросом/скриптом / 8 сообщений из 8, страница 1 из 1
03.04.2018, 12:07
    #39624643
Arti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом/скриптом
Здравствуйте!
На входе дана такая таблица:

время сумма
12:20 500
12:21 600
12:22 -500
12:30 1000
13:00 700
13:01 -700
13:02 700

Скажите, как можно удалить парные записи (в примере выше выделены жирным ) по таким условиям:
1. Сумма в парных записях одинакова по модулю, но отличается по знаку.
2. Разница по времени между двумя парными записями не более 10 минут.
3. Между двумя парными записями могут быть другие, не относящиеся к этой паре.
4. Обратите внимание - последнюю запись в примере вверху удалять не нужно, т.к. у нее нет пары (предыдущая запись уже является парной). Т.е. нужно удалить парные записи так, чтобы общая сумма по столбцу "сумма" не поменялась. Т.е. удаляем только четное число записей в каждой из цепочек.


результат:
время сумма
12:21 600
12:30 1000
13:02 700


Можно ли это как-то реализовать только на чистом SQL (т.е. без использования скриптов с циклами и т.п.)?
У меня одна из проблем связана с реализацией п.4

Спасибо!
P.S. Не обязательно на синтаксисе ACCESS, можно другой СУБД.
...
Рейтинг: 0 / 0
03.04.2018, 12:39
    #39624677
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом/скриптом
Вопрос 1: можно ли п. 1 дополнить условием, что время у записи с отрицательной суммой больше комплементарной ей записи с положительной суммой?
Вопрос 2: какая из записей должна остаться в случаевремя сумма10:00 10010:01 10010:02 10010:03 -10010:04 -100и почему?
...
Рейтинг: 0 / 0
03.04.2018, 12:57
    #39624698
Arti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом/скриптом
Akina ,
1.
Вообще может быть и обратный порядок, т.е. сначала идет запись с отрицательной суммой, а потом с положительной. И обе ситуации могут встречаться, т.е. не являются исключениями.
Но можно реализовать хотя бы вариант, когда сначала только положительная, если это сделать проще. Потом, возможно, просто продублировать с небольшими изменениями для обратной ситуации?

2.
Насколько я понимаю, возможны как минимум два варианта:
2.1. FIFO (first in, first out). Тогда должна остаться запись
10:02 100

2.2. LIFO (last in, first out). Тогда должна остаться запись
10:00 100

Я пока еще сам не определился, какое правило более корректное, т.к. не знаю все особенности данного бизнес-процесса. Но могу сказать, что такая ситуация не является характерной, т.е. является относительно редкой (хоть и исключить ее нельзя).
Можно реализовать то, что проще.
...
Рейтинг: 0 / 0
03.04.2018, 13:07
    #39624715
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом/скриптом
ArtiP.S. Не обязательно на синтаксисе ACCESS, можно другой СУБД.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare @t table (id int, время datetime, сумма money)

insert into @t values
(1, '12:20', 500),
(2, '12:21', 600),
(3, '12:22', -500),
(4, '12:30', 1000),
(5, '13:00', 700),
(6, '13:01', -700),
--(7, '13:02', -700),
(8, '13:02', 700)

;with cte as (
	select t1.id as id_plus, t2.id as id_minus, t1.сумма as S_plus, t2.сумма as S_minus 
		,rn1	=row_number()over(partition by t1.id order by t2.id) 
		,rn2	=row_number()over(partition by t2.id order by t1.id) 
	from @t t1 inner join @t t2 on t1.сумма=-t2.сумма and abs(datediff(second,t1.время,t2.время)) between 0 and 360
	where t2.сумма<0)

--select * from cte 

select * from @t
where id not in (select id_plus from cte where rn1=rn2 union all select id_minus from cte where rn1=rn2)


idвремясумма21900-01-01 12:21:00.000600,0041900-01-01 12:30:00.0001000,0081900-01-01 13:02:00.000700,00
...
Рейтинг: 0 / 0
11.04.2018, 20:20
    #39628712
Arti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом/скриптом
court , большое спасибо вам за скрипт!
Мне самому было бы сложно такое придумать.
Если не секрет, насколько часто вы с такого рода логикой в запросах встречаетесь?
Или вы придумали специально под эту задачу?
...
Рейтинг: 0 / 0
12.04.2018, 09:45
    #39628867
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом/скриптом
ArtiИли вы придумали специально под эту задачу?да

Кстати, я не уверен в оптимальности такого решения.
Думаю, если бы вы спросили в ГФ, там бы предложили что-то и получше :)
...
Рейтинг: 0 / 0
12.04.2018, 15:00
    #39629211
Arti
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом/скриптом
court , я не знаю, можно ли сделать более эффективный запрос с т.з. скорости работы, но логика работы вроде верная, размер компактный.

Скажите, а что такое ГФ?
Я не нашел здесь специального форума, где можно было бы задавать вопросы по "общему" SQL.
Если только "Вопрос-Ответ"?
...
Рейтинг: 0 / 0
13.04.2018, 06:31
    #39629576
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом/скриптом
ArtiСкажите, а что такое ГФ?Это форум по МS SQL - http://www.sql.ru/forum/microsoft-sql-server
ArtiЯ не нашел здесь специального форума, где можно было бы задавать вопросы по "общему" SQL.Сначала нужно определиться, что такое "общий SQL" :) , так как последний стандарт, вроде как уже содержит оконные функции ...
Но всегда можно уточнить, что запрос должен быть в стандарте ANSi-89 SQL
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите с запросом/скриптом / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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