How To Compare Successive Rows Within The Same Table in MySQL

摘要:在本教程中,我们将向您展示如何使用自连接技术比较同一表中的连续行。

假设您有一个名为inventory的表,其结构由CREATE TABLE语句定义,如下所示:

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
);Code language: SQL (Structured Query Language) (sql)

inventory表中:

  • id是一个自动递增列。
  • counted_date是计数日期
  • item_no是过帐到库存的商品代码。
  • qty是库存中的累计现有数量。

库存表的样本数据如下:

INSERT INTO inventory(counted_date,item_no,qty)
VALUES ('2014-10-01','A',20),
	   ('2014-10-01','A',30),
	   ('2014-10-01','A',45),
	   ('2014-10-01','A',80),
	   ('2014-10-01','A',100);Code language: SQL (Structured Query Language) (sql)
MySQL Compare Successive Rows

如果您想了解每种商品每天收到的商品数量,您需要将特定日期与前一天的现有数量进行比较。

换句话说,在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';Code language: SQL (Structured Query Language) (sql)
MySQL 连续行示例

INNER JOIN子句 g2.id = g1.id + 1 中的条件允许您将 inventory 表中的当前行与下一行进行比较,当然,前提是 id 列中没有间隙。

如果您无法避免间隙,您可以创建一个附加列(例如seq来维护行的顺序,以便您应用此技术。

在本教程中,您学习了如何使用自连接技术比较同一表中的连续行。

本教程有帮助吗?