簡體   English   中英

從上一行MySQL減去數量

[英]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升序。 我們只是在猜測。

假設序列是通過timestampid ,並且假設(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM