Помогите найти движение товаров между датами
Подскажите пожалуйста как найти движение товаров по дню.
У нас есть сумма на конец дня это Итог за день = 5
Требуется найти движение в промежутках времени, а именно из последнего вычитаем предыдущее, то есть из 5 - 2 = 3, далее из предпоследнего предыдущее ему: 2 - 1 = 1, далее между последними двумя датами: 1 - 2 = -1
create table #info
(
Date smalldatetime,
Brief varchar(20),
Qty money
)
insert into #info
select '2021-09-14 21:36:00', 'Итог по 1', 5 union all
select '2021-09-14 22:36:00', 'Итог по 2', 10 union all
select '2021-09-14 15:25:00', 'Товар', 2 union all
select '2021-09-14 12:47:00', 'Товар', 1 union all
select '2021-09-14 10:22:00', 'Товар', 2 union all
select '2021-09-14 16:27:00', 'Товар2', 5 union all
select '2021-09-14 15:34:00', 'Товар2', 3 union all
select '2021-09-14 12:55:00', 'Товар2', 2
Получиться должно так:
То есть, за день было 3 движения по товару и 3 движения по 2ому товару.
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
SELECT *, Qty - LAG(Qty) OVER (ORDER BY Date) change
FROM #info
ORDER BY Date DESC;
или
WITH cte AS ( SELECT *, Qty - LAG(Qty) OVER (ORDER BY Date) change
FROM #info )
SELECT Date, N'Товар' Brief, change Qty
FROM cte
WHERE change IS NOT NULL;
А данный запрос возможно написать без функции LAG() ? – Graund
SELECT t1.Date, t1.Brief, t1.Qty - t2.Qty change
FROM #info t1
JOIN #info t2 ON t1.Date > t2.Date
WHERE NOT EXISTS ( SELECT NULL
FROM #info t3
WHERE t1.Date > t3.Date
AND t3.Date > t2.Date)
или
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY Date) rn
FROM #info )
SELECT t1.Date, t1.Brief, t1.Qty - t2.Qty change
FROM cte t1
JOIN cte t2 ON t1.rn = t2.rn + 1;
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=f6d6aa25cdf4df2ab432cfdaf6b32994
