基于SQL减去基于日期和另一列的两行我有一个好主意,但我需要别的东西。
我有下表(库存):
animal date quantity
dog 2015-01-01 400
cat 2015-01-01 300
dog 2015-01-02 402
rabbit 2015-01-01 500
cat 2015-01-02 304
rabbit 2015-01-02 508
rabbit 2015-01-03 524
rabbit 2015-01-04 556
rabbit 2015-01-05 620
rabbit 2015-01-06 748
Run Code Online (Sandbox Code Playgroud)
通过运行此查询:
SELECT a.animal, a.Date
AS actual_date, past_date.Date
AS past_date, (a.quantity - past_date.quantity)
AS quantity_diff
FROM inventory a
JOIN
(SELECT b.animal, b.date AS date1,
(SELECT MAX(c.date)
FROM inventory c
WHERE c.date < b.date AND c.animal = b.animal
GROUP BY c.animal)
AS date2
FROM inventory b)
AS original_date ON original_date.animal = a.animal
AND original_date.date1 = a.date
JOIN
inventory past_date
ON past_date.animal = a.animal
AND past_date.date = original_date.date2
Run Code Online (Sandbox Code Playgroud)
我明白了:
animal actual_date past_date quantity_diff
dog 2015-01-02 2015-01-01 2
cat 2015-01-02 2015-01-01 4
rabbit 2015-01-02 2015-01-01 8
rabbit 2015-01-03 2015-01-02 16
rabbit 2015-01-04 2015-01-03 32
rabbit 2015-01-05 2015-01-04 64
rabbit 2015-01-06 2015-01-05 128
Run Code Online (Sandbox Code Playgroud)
我想得到的是这个(见quantity_diff 列):
animal quantity_diff
cat 4
cat NULL
dog 2
dog NULL
rabbit 8
rabbit 16
rabbit 32
rabbit 64
rabbit 128
rabbit NULL
Run Code Online (Sandbox Code Playgroud)
问题发生了一些变化,这是我目前对你想要的东西的理解。
CREATE TABLE inventory
(`animal` varchar(6), `date` date, `quantity` int);
INSERT INTO inventory
(`animal`, `date`, `quantity`)
VALUES
('dog', '2015-01-01', 400),
('cat', '2015-01-01', 300),
('dog', '2015-01-02', 402),
('rabbit', '2015-01-01', 500),
('cat', '2015-01-02', 304),
('rabbit', '2015-01-02', 508),
('rabbit', '2015-01-03', 524),
('rabbit', '2015-01-04', 556),
('rabbit', '2015-01-05', 620),
('rabbit', '2015-01-06', 748);
Run Code Online (Sandbox Code Playgroud)
select animal,actual_date,past_date,quantity_diff
from
( SELECT a.animal, a.Date
AS actual_date, past_date.Date
AS past_date, (a.quantity - past_date.quantity)
AS quantity_diff,
1 as drewOrder
FROM inventory a
JOIN
(SELECT b.animal, b.date AS date1,
(SELECT MAX(c.date)
FROM inventory c
WHERE c.date < b.date AND c.animal = b.animal
GROUP BY c.animal)
AS date2
FROM inventory b)
AS original_date ON original_date.animal = a.animal
AND original_date.date1 = a.date
JOIN
inventory past_date
ON past_date.animal = a.animal
AND past_date.date = original_date.date2
union
select distinct animal,null,null,null,2 as drewOrder from inventory
) x
order by x.animal,x.drewOrder,x.actual_date;
Run Code Online (Sandbox Code Playgroud)
+--------+-------------+------------+---------------+
| animal | actual_date | past_date | quantity_diff |
+--------+-------------+------------+---------------+
| cat | 2015-01-02 | 2015-01-01 | 4 |
| cat | NULL | NULL | NULL |
| dog | 2015-01-02 | 2015-01-01 | 2 |
| dog | NULL | NULL | NULL |
| rabbit | 2015-01-02 | 2015-01-01 | 8 |
| rabbit | 2015-01-03 | 2015-01-02 | 16 |
| rabbit | 2015-01-04 | 2015-01-03 | 32 |
| rabbit | 2015-01-05 | 2015-01-04 | 64 |
| rabbit | 2015-01-06 | 2015-01-05 | 128 |
| rabbit | NULL | NULL | NULL |
+--------+-------------+------------+---------------+
Run Code Online (Sandbox Code Playgroud)