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

Откуда:
Сообщений: 4
ID integer Идентификатор записи
DayID date Дата
ArtID integer Идентификатор товарной позиции
CntrID integer Идентификатор контрагента склада
EndQnty decimal(16, 3) Остаток на складе
1. Необходимо написать запрос, который покажет, сколько непрерывно дней у товарной позиции нет отгрузок со склада на каждую дату.
Источник данных:
• dbo.tTestTable1
Вывести следующие поля:
• Дата
• Идентификатор контрагента склада
• Идентификатор товарной позиции
• Остаток на складе
• Количество дней без отгрузок

Подскажите как можно реализовать данный запрос, единственное до чего додумался
select ArtID , abs (DATEDIFF(day,max(DayID),min(DayID))) from Table_1 group by ArtID
но этого не достаточно
31 июл 18, 21:03    [21619383]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
Oleg-555
1. Необходимо написать запрос, который покажет, сколько непрерывно дней у товарной позиции нет отгрузок со склада на каждую дату.
Вы бы предоставили скрипт с тестовыми данными.
А то, во первых, как помогать вам сделать запрос, во вторых, непонятен признак "нет отгрузок" - это когда нет записей, или когда EndQnty не меняется?
31 июл 18, 21:51    [21619458]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
mnbvcx
Member

Откуда:
Сообщений: 219
Oleg-555, это ведь известный класс задач, даже если в гугле вбить заголовок топика, то выходит статья на хабре.

"Задача поиска непрерывных последовательностей событий довольно легко решается с помощью SQL. Давайте уточним, что из себя представляют эти последовательности." ...
https://habr.com/post/270573/
31 июл 18, 21:59    [21619488]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
mnbvcx
Member

Откуда:
Сообщений: 219
Oleg-555, тут больше разных реализаций, посмотри
https://habr.com/post/327862/
31 июл 18, 22:04    [21619503]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
Oleg-555
Member

Откуда:
Сообщений: 4
alexeyvg,
В таблице содержится информация по товарным позициям, по которым отсутствуют отгрузки со склада.
1 2018-07-31 88 7 10,000
2 2018-07-30 88 8 15,000
3 2018-07-30 88 8 20,000
4 2018-07-30 99 9 22,000
5 2018-07-29 55 5 5,000
6 2018-07-29 88 8 5,000
это тд
31 июл 18, 22:04    [21619504]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
Oleg-555
Member

Откуда:
Сообщений: 4
mnbvcx,
Я не совсем понимаю как это можно адаптировать под мою задачу и какой запрос более точно подойдет
31 июл 18, 22:14    [21619524]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
declare @tTestTable1 table (
ID integer,
DayID date,
ArtID integer,
CntrID integer,
EndQnty decimal(16, 3)
)

Insert into @tTestTable1 values 
(1, '2018-07-29', 88, 8, 5.000),
(2, '2018-07-29', 55, 5, 5.000),
(3, '2018-07-30', 99, 9, 22.000),
(4, '2018-07-30', 88, 8, 20.000),
(5, '2018-07-30', 88, 8, 15.000),
(6, '2018-07-31', 88, 7, 10.000);

With Sales as
(Select *,case When lag(EndQnty) over (Partition by ArtID Order by DayID, ID) <= EndQnty Then 0 else 1 End as IsSale From @tTestTable1),
Groups as 
(Select *,sum(IsSale) Over (Partition by ArtID Order by DayID, ID) as Grp From Sales)

Select ID,DayID,ArtID,CntrID,EndQnty,
DATEDIFF(d,
isnull(min(DayID) over (Partition by ArtID,Grp Order by DayID, ID Rows between UNBOUNDED PRECEDING and 1 PRECEDING),--Ищем начало цепочки непродаж среди предыдущих значений
       lag(DayID) over (Partition by ArtID,IsSale Order by grp)),--Если не нашли, значит это и есть начало цепочки, поэтому берем дату предыдущей продажи
DayID) as DaysPrevSales
 From Groups
Order by ArtID,DayID,id


Если надо в считать в разрезе складов - добавить в каждый "Partition By" поле "CntrID"
1 авг 18, 05:57    [21619800]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
Kopelly,

я помню, что место твоей работы - секрет.
но, возможно, "не секрет" хотя бы стэк используемых у вас на работе технологий?

Если не хочешь отвечать публично, может напишешь "приватно", на мыло?
bsm<тут должна быть собака>au<я тут - точка>ru

З.Ы.
2 модераторы...
сорри за злостный оффтоп :)
1 авг 18, 09:52    [21620081]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Только с запросами SQL и работаю (ну и разве что отчеты в Report Builder)...
Ни обслуживанием сервера, ни написанием прикладного ПО не занимаюсь...
1 авг 18, 10:20    [21620182]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
Бабичев Сергей
Member

Откуда: Красноярск
Сообщений: 2497
Kopelly,

Спасибо за ответ! :)
1 авг 18, 10:30    [21620249]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
Oleg-555
Member

Откуда:
Сообщений: 4
Kopelly,
Спасибо вам большое, у меня заработало))
А с какой стороны можно подойти лучше что бы решить такую задачу

Посчитать разницу остатка первого дня непрерывной последовательности отсутствия отгрузок у товарной позиции и датой.
Источник данных:
* dbo.tTestTable1
Вывести следующие поля:
Дата
Идентификатор контрагента склада
Идентификатор товарной позиции
Остаток на складе
Количество дней без отгрузок
Разница остатка
Я пытаюсь модернизировать не пойму что менять нужно.....
1 авг 18, 20:40    [21622367]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на получение непрерывных последовательностей  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1467
Oleg-555
Посчитать разницу остатка первого дня непрерывной последовательности отсутствия отгрузок у товарной позиции и датой.
first_value() over(partition by ...)
2 авг 18, 06:01    [21623056]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить