powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Выборка цен с шагом изменения в 5%
6 сообщений из 6, страница 1 из 1
Выборка цен с шагом изменения в 5%
    #40104337
irina zakharova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Такая вот задача.
Есть таблица с товарами и цена на каждый день.
Нужно сделать новый столбец используя price.
Если цена изменилась по модулю<5%, то ставить предыдущую.
Проблема в том, что нельзя просто взять lag и сравнивать price с lag(price), тк нужно сравнивать с самым первым столбцом.
Как цена изменилась 5% ставить эту цену и сравнивать уже с ней, до следующего изменения в 5%
...
Рейтинг: 0 / 0
Выборка цен с шагом изменения в 5%
    #40104347
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблемы не в процентах - проблемы в головах.

1. Делаем список опорных цен:
1-я.
2-следующая на 5% большая
3-следующая на 5% большая
...
рекурсивное CTE.

2. Запихиваем исходные цены в эти интервалы и меняем их цену на базовую цену интервала.
...
Рейтинг: 0 / 0
Выборка цен с шагом изменения в 5%
    #40104349
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
irina zakharova,


для примера:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare @t table (id int identity(1,1), price int)

insert @t values (153), (153), (156), (156), (156), (234), (245), (243), (243), (246), (248)

-- для проверки с большим числом изменений:
--insert @t values (153), (153), (156), (156), (156), (234), (245), (243), (243), (246), (248), (253), (353), (356), (356), (356), (434), (545), (643), (643), (646), (648)

;with cte as 
(
select *, case when abs(price - lag(price) over(order by id))*100/lag(price) over(order by id) >  4 
		       then 1 
			   else 0 
			   end change
 from @t
) 
select a.id, a.price, isnull(c.price, d.price) newprice 
 from cte a
outer apply (select top 1 price from cte b where b.id <= a.id and b.change = 1 order by id desc) c
outer apply (select top 1 price from cte b where b.id <= a.id order by id) d




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
id          price       newprice
----------- ----------- -----------
1           153         153
2           153         153
3           156         153
4           156         153
5           156         153
6           234         234
7           245         234
8           243         234
9           243         234
10          246         234
11          248         234
...
Рейтинг: 0 / 0
Выборка цен с шагом изменения в 5%
    #40104409
irina zakharova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg_SQL,
Я к сожалению засунула вопрос в ms sql, а мне надо на vertica

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Выборка цен с шагом изменения в 5%
    #40104598
irina zakharova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222, а можно пожалуйста, подробнее?) те с примером)
...
Рейтинг: 0 / 0
Выборка цен с шагом изменения в 5%
    #40104600
irina zakharova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg_SQL,

не подходит, тут как раз сравнивается нижнее значение с предыдущим и проставляется флаг заменять или нет, а нужно сравнивать с самым первым значением, до того как будет больше 5%, есть больше, то сравнивать уже с новым значением.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare @t table (id int identity(1,1), price int)

insert @t values (156), (153), (156), (149), (146), (234), (245), (243), (243), (246), (248)


-- для проверки с большим числом изменений:
--insert @t values (153), (153), (156), (156), (156), (234), (245), (243), (243), (246), (248), (253), (353), (356), (356), (356), (434), (545), (643), (643), (646), (648)

;with cte as 
(
select *, case when abs(price - lag(price) over(order by id))*100/lag(price) over(order by id) >  4 
		       then 1 
			   else 0 
			   end change
 from @t
) 
select a.id, a.price, isnull(c.price, d.price) newprice 
 from cte a
outer apply (select top 1 price from cte b where b.id <= a.id and b.change = 1 order by id desc) c
outer apply (select top 1 price from cte b where b.id <= a.id order by id) d
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Выборка цен с шагом изменения в 5%
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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