У меня есть простая инвентарная таблица:
IF OBJECT_ID('tempdb.dbo.#t') IS NOT NULL
DROP TABLE #t
GO
CREATE TABLE #t
(
[date] DATE,
Item VARCHAR(1),
[Location] INT,
Qty INT
)
INSERT INTO #t ([date], [Item], [Location], [Qty])
VALUES ('2017-11-16', 'A', 1, 5),
('2017-11-16', 'B', 1, 5),
('2017-11-16', 'B', 2, 10),
('2017-11-16', 'A', 3, 1),
('2017-11-16', 'C', 3, 2),
('2017-11-16', 'A', 4, 20),
('2017-11-15', 'A', 1, 5),
('2017-11-15', 'B', 1, 5),
('2017-11-15', 'B', 2, 10),
('2017-11-15', 'A', 3, 1),
('2017-11-15', 'C', 3, 8),
('2017-11-14', 'A', 1, 10),
('2017-11-14', 'B', 1, 1),
('2017-11-14', 'B', 2, 10),
('2017-11-14', 'A', 3, 1),
('2017-11-14', 'C', 3, 8)
Я хотел бы узнать дату (в предложении where), а также разницу в количестве местоположения-элемента-уровня для прошлого.
Таким образом, результат должен быть следующим:
+------------+------+----------+-----+------------+---------+
| Date | Item | Location | Qty | LastChange | LastQty |
+------------+------+----------+-----+------------+---------+
| 16.11.2017 | A | 1 | 5 | 14.11.2017 | 10 |
| 16.11.2017 | B | 1 | 5 | 14.11.2017 | 1 |
| 16.11.2017 | B | 2 | 10 | | |
| 16.11.2017 | A | 3 | 1 | | |
| 16.11.2017 | C | 3 | 2 | 15.11.2017 | 8 |
| 16.11.2017 | A | 4 | 20 | | |
+------------+------+----------+-----+------------+---------+
Поскольку инвентарная таблица довольно большая, я хотел бы по возможности избегать оконных функций.
Я самостоятельно присоединился к инвентарной таблице. Однако у меня есть проблемы с поиском пункта для исключения нерелевантных наборов данных.
SELECT
a.[date],
a.Item,
a.Location,
a.qty,
b.[date] LastChange,
b.qty LastQty
FROM
#t a
LEFT JOIN
#t b ON a.Item = b.Item
AND a.location = b.location
AND b.date < a.date
WHERE
a.date = '2017-11-16'