MySQL比較相同表中的連續行

2019-10-16 22:56:55

在本教學中,我們將介紹如何使用自連線技術來比較同一個表中的連續行。

假設您有一個名為inventory的表,其中包含由CREATE TABLE語句定義的結構,如下所示:

USE testdb;
CREATE TABLE inventory(
  id INT AUTO_INCREMENT PRIMARY KEY,
  counted_date date NOT NULL,
  item_no VARCHAR(20) NOT NULL,
  qty int(11) NOT NULL
);

在庫存(inventory)表中:

  • id是自動增量列。
  • count_date是計數日期。
  • item_no是發布到廣告資源的商品程式碼。
  • qty是庫存中累計的現貨數量。

以下是inventory表的範例資料:

INSERT INTO inventory(counted_date,item_no,qty)
VALUES ('2017-10-01','A',20),
    ('2017-10-01','A',30),
    ('2017-10-01','A',45),
    ('2017-10-01','A',80),
    ('2017-10-01','A',100);

如果想知道每個物品每天收到的物品數量,需要將特定日期的現有數量與前一天進行比較。

換句話說,在inventory表中,需要將一行與其連續行進行比較以找出差異。

在MySQL中,可以使用自連線技術來比較連續的行,如以下查詢:

SELECT 
    g1.item_no,
    g1.counted_date from_date,
    g2.counted_date to_date,
    (g2.qty - g1.qty) AS receipt_qty
FROM
    inventory g1
        INNER JOIN
    inventory g2 ON g2.id = g1.id + 1
WHERE
    g1.item_no = 'A';

執行上面查詢語句,得到以下結果 -

+---------+------------+------------+-------------+
| item_no | from_date  | to_date    | receipt_qty |
+---------+------------+------------+-------------+
| A       | 2017-10-01 | 2017-10-01 |          10 |
| A       | 2017-10-01 | 2017-10-01 |          15 |
| A       | 2017-10-01 | 2017-10-01 |          35 |
| A       | 2017-10-01 | 2017-10-01 |          20 |
+---------+------------+------------+-------------+
4 rows in set

INNER JOIN子句g2.id = g1.id + 1中的條件允許您將當前行與inventory表中的下一行進行比較,當然,假設id列中沒有間隙。

如果無法避免差距,您可以建立一個附加列,例如seq來維護行的順序,以便應用此技術。

在本教學中,您已經學會了如何使用自連線技術來比較同一個表中的連續行。