Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
А то, во первых, как помогать вам сделать запрос, во вторых, непонятен признак "нет отгрузок" - это когда нет записей, или когда EndQnty не меняется? |
||
31 июл 18, 21:51 [21619458] Ответить | Цитировать Сообщить модератору |
mnbvcx Member Откуда: Сообщений: 265 |
Oleg-555, это ведь известный класс задач, даже если в гугле вбить заголовок топика, то выходит статья на хабре. "Задача поиска непрерывных последовательностей событий довольно легко решается с помощью SQL. Давайте уточним, что из себя представляют эти последовательности." ... https://habr.com/post/270573/ |
31 июл 18, 21:59 [21619488] Ответить | Цитировать Сообщить модератору |
mnbvcx Member Откуда: Сообщений: 265 |
Oleg-555, тут больше разных реализаций, посмотри https://habr.com/post/327862/ |
31 июл 18, 22:04 [21619503] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Oleg-555 Member Откуда: Сообщений: 4 |
mnbvcx, Я не совсем понимаю как это можно адаптировать под мою задачу и какой запрос более точно подойдет |
31 июл 18, 22:14 [21619524] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Бабичев Сергей Member Откуда: Сообщений: 2506 |
Kopelly, я помню, что место твоей работы - секрет. но, возможно, "не секрет" хотя бы стэк используемых у вас на работе технологий? Если не хочешь отвечать публично, может напишешь "приватно", на мыло? bsm<тут должна быть собака>au<я тут - точка>ru З.Ы. 2 модераторы... сорри за злостный оффтоп :) |
1 авг 18, 09:52 [21620081] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
Только с запросами SQL и работаю (ну и разве что отчеты в Report Builder)... Ни обслуживанием сервера, ни написанием прикладного ПО не занимаюсь... |
1 авг 18, 10:20 [21620182] Ответить | Цитировать Сообщить модератору |
Бабичев Сергей Member Откуда: Сообщений: 2506 |
Kopelly, Спасибо за ответ! :) |
1 авг 18, 10:30 [21620249] Ответить | Цитировать Сообщить модератору |
Oleg-555 Member Откуда: Сообщений: 4 |
Kopelly, Спасибо вам большое, у меня заработало)) А с какой стороны можно подойти лучше что бы решить такую задачу Посчитать разницу остатка первого дня непрерывной последовательности отсутствия отгрузок у товарной позиции и датой. Источник данных: * dbo.tTestTable1 Вывести следующие поля: Дата Идентификатор контрагента склада Идентификатор товарной позиции Остаток на складе Количество дней без отгрузок Разница остатка Я пытаюсь модернизировать не пойму что менять нужно..... |
1 авг 18, 20:40 [21622367] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
|
||
2 авг 18, 06:01 [21623056] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |