[英]Subtract Quantity From Previous Row MySQL
在這方面遇到困難。 我在PHP中回顯了這些數據,但我認為在MySQL中進行查詢會更好。
這是我的桌子:
我的查詢(錯誤):
SELECT i1.Quantity,
i1.timestamp,
(i2.Quantity - i1.Quantity) as sold_qty
FROM InventoryTest_history i1
INNER JOIN
InventoryTest_history i2 ON i2.id = i1.id + 1
WHERE i1.SKU = '(L) U-Joint'
僅檢索兩行,並且sold_qty錯誤。
我試圖達到的結果將如下所示:
Quantity | timestamp | sold_qty
985 2016-12-27 0
960 2016-12-28 25
955 2016-12-29 5
有人可以幫忙嗎?
一種選擇是使用相關子查詢。 對於大集合,這當然不是最有效的方法,但是對於返回的行數有限,它是可行的。
您似乎需要一個序列來處理和返回行,但是沒有ORDER BY
子句。 從示例數據來看,它看起來像是按timestamp
列升序,按Quantity
列降序和/或按id
升序。 我們只是在猜測。
假設序列是通過timestamp
和id
,並且假設(timestamp,id)
元組是唯一的...這些是相當合理的假設,但它們只是假設,並且是相當大的假設...
SELECT ih.Quantity
, ih.timestamp
, IFNULL(
( SELECT pr.Quantity
FROM InventoryTest_history pr
WHERE pr.SKU = ih.SKU
AND pr.timestamp <= ih.timestamp
AND (pr.timestamp < ih.timestamp OR pr.id < ih.id )
ORDER BY pr.SKU DESC, pr.timestamp DESC, pr.id DESC
LIMIT 1
)
- ih.Quantity
,0) AS sold_qty
FROM InventoryTest_history ih
WHERE ih.SKU = '(L) U-Joint'
ORDER BY ...
為了獲得最佳性能和最佳性能,我們希望覆蓋索引可用於相關子查詢,作為適當索引的示例:
... ON InventoryTest_history (SKU, timestamp, id, quantity)
如果應認為行不是按(timestamp,id)
排序,則需要修改ORDER BY
和子查詢的WHERE
子句中的條件。
這只是一種可能的方法。 還有其他查詢模式將返回等效結果。
您也可以不使用JOIN表就使用它:out SELECT僅用於隱藏一些列。
SELECT Quantity, `timestamp`, sold_qty
FROM (
SELECT i.*,
@sold_qty := GREATEST(@last_qty - i.`Quantity`,0) as sold_qty,
@last_qty := i.`Quantity` as last_qty
FROM InventoryTest_history i
CROSS JOIN ( SELECT @last_qty := '', @sold_qty := 0) as init
ORDER BY `timestamp`
) as result;
樣品
mysql> SELECT * from InventoryTest_history;
+----+-------------+----------+---------------------+
| id | SKU | Quantity | timestamp |
+----+-------------+----------+---------------------+
| 1 | (L) U-Joint | 985 | 2016-12-27 10:08:58 |
| 2 | (L) U-Joint | 960 | 2016-12-28 10:09:52 |
| 3 | (L) U-Joint | 955 | 2016-12-29 16:01:02 |
+----+-------------+----------+---------------------+
3 rows in set (0,02 sec)
mysql> SELECT Quantity, `timestamp`, sold_qty
-> FROM (
-> SELECT i.*,
-> @sold_qty := GREATEST(@last_qty - i.`Quantity`,0) as sold_qty,
-> @last_qty := i.`Quantity` as last_qty
-> FROM InventoryTest_history i
-> CROSS JOIN ( SELECT @last_qty := '', @sold_qty := 0) as init
-> ORDER BY `timestamp`
-> ) as result;
+----------+---------------------+----------+
| Quantity | timestamp | sold_qty |
+----------+---------------------+----------+
| 985 | 2016-12-27 10:08:58 | 0 |
| 960 | 2016-12-28 10:09:52 | 25 |
| 955 | 2016-12-29 16:01:02 | 5 |
+----------+---------------------+----------+
3 rows in set (0,00 sec)
mysql> SELECT i.*,
-> @sold_qty := GREATEST(@last_qty - i.`Quantity`,0) as sold_qty,
-> @last_qty := i.`Quantity` as last_qty
-> FROM InventoryTest_history i
-> CROSS JOIN ( SELECT @last_qty := '', @sold_qty := 0) as init
-> ORDER BY `timestamp`;
+----+-------------+----------+---------------------+----------+----------+
| id | SKU | Quantity | timestamp | sold_qty | last_qty |
+----+-------------+----------+---------------------+----------+----------+
| 1 | (L) U-Joint | 985 | 2016-12-27 10:08:58 | 0 | 985 |
| 2 | (L) U-Joint | 960 | 2016-12-28 10:09:52 | 25 | 960 |
| 3 | (L) U-Joint | 955 | 2016-12-29 16:01:02 | 5 | 955 |
+----+-------------+----------+---------------------+----------+----------+
3 rows in set (0,00 sec)
mysql>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.