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

Откуда:
Сообщений: 60
Доброго времени суток.

В sql я не очень силен (в основном делаю только линейные выборки, сортировки, группировки), окажите содействие в решении следующей задачи.
Есть вьюшка результатом которой мы получаем- дата(формат 20190101 -число), номенклатура (формат число), количество (число), сумма оборот (число) получаем порядка 3 млн строк.
Есть другая вьюшка, результат которой- дата (число 20190101), номенклатура (число), себестоимость за единицу (число), порядка 300 тыс строк.

Необходимо к первой вьюшке прикрутить себестоимость из 2, по следующему условию - Вьюшка1.Номенклатура = Вьюшка2.Номенклатура И Вьюшка2.Дата<=Вьюшка1.Дата (ищем ближайшее значение себестоимости по номенклатуре и периоду).

Пробовал к первой вьюшке делать подзапрос (Select top 1 себестоимость From вьюшка2 where Вьюшка1.Номенклатура = Вьюшка2.Номенклатура И Вьюшка2.Дата<=Вьюшка1.Дата Order by Дата), но это висит просто неимоверно долго.
3 май 19, 14:43    [21877344]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос поиск ближайшего значения  [new]
aleks222
Member

Откуда:
Сообщений: 595
Кнопка "Сделать фсе быстро и правильно" никак не выйдет из стадии бета-тестирования.

Вариантов у тя два
1. Быстрый и неправильный - материализовать View: select * into #t from View/
2. Небыстрый и правильный - таки выкинуть из вьюшек лишнее и написать их правильно.
3 май 19, 16:10    [21877384]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос поиск ближайшего значения  [new]
TheRookie
Member

Откуда:
Сообщений: 7
Baters
Необходимо к первой вьюшке прикрутить себестоимость из 2, по следующему условию - Вьюшка1.Номенклатура = Вьюшка2.Номенклатура И Вьюшка2.Дата<=Вьюшка1.Дата (ищем ближайшее значение себестоимости по номенклатуре и периоду).

Пробовал к первой вьюшке делать подзапрос (Select top 1 себестоимость From вьюшка2 where Вьюшка1.Номенклатура = Вьюшка2.Номенклатура И Вьюшка2.Дата<=Вьюшка1.Дата Order by Дата), но это висит просто неимоверно долго.


3. Попробуй через CROSS APPLY - вдруг повезёт.
4. Попробуй переписать запрос - вместо названий вьюшек подставить их определение - иногда это помогает.
3 май 19, 16:18    [21877388]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос поиск ближайшего значения  [new]
Baters
Member

Откуда:
Сообщений: 60
а функция last_Value (MS 2012) может ине подсобить (гуглю, все похожее)?
3 май 19, 16:36    [21877396]     Ответить | Цитировать Сообщить модератору
 Re: sql запрос поиск ближайшего значения  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 278
Может помочь lead/lag:
With [периоды себестоимости] as 
(Select *,lead([Дата],1,@MaxDate) Over(Partiotion by [номеклатура] Order by [Дата]) as [ДатаОкончания] From [Себестоимость])
Select a.*, b.[Себестоимость]
From [Обороты] a
join [периоды себестоимости]  b on a.[номеклатура] = b.[номеклатура] and a.[Дата] >= b.[Дата] and a.[Дата] < b.[ДатаОкончания]
3 май 19, 17:54    [21877430]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить