powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите с запросом/скриптом
8 сообщений из 8, страница 1 из 1
Помогите с запросом/скриптом
    #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
Помогите с запросом/скриптом
    #39624677
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос 1: можно ли п. 1 дополнить условием, что время у записи с отрицательной суммой больше комплементарной ей записи с положительной суммой?
Вопрос 2: какая из записей должна остаться в случаевремя сумма10:00 10010:01 10010:02 10010:03 -10010:04 -100и почему?
...
Рейтинг: 0 / 0
Помогите с запросом/скриптом
    #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
Помогите с запросом/скриптом
    #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
Помогите с запросом/скриптом
    #39628712
Arti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court , большое спасибо вам за скрипт!
Мне самому было бы сложно такое придумать.
Если не секрет, насколько часто вы с такого рода логикой в запросах встречаетесь?
Или вы придумали специально под эту задачу?
...
Рейтинг: 0 / 0
Помогите с запросом/скриптом
    #39628867
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtiИли вы придумали специально под эту задачу?да

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

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


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