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 );在
inventory
表中:
以下是库存 表的示例数据:
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);
+----+--------------+---------+-----+ | id | counted_date | item_no | qty | +----+--------------+---------+-----+ | 1 | 2014-10-01 | A | 20 | | 2 | 2014-10-01 | A | 30 | | 3 | 2014-10-01 | A | 45 | | 4 | 2014-10-01 | A | 80 | | 5 | 2014-10-01 | A | 100 | +----+--------------+---------+-----+ 5 rows in set (0.00 sec)如果您想知道每件商品每天收到的商品数量,您需要将特定日期的现有数量与前一天进行比较。 换句话说,在
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 | 2014-10-01 | 2014-10-01 | 10 | | A | 2014-10-01 | 2014-10-01 | 15 | | A | 2014-10-01 | 2014-10-01 | 35 | | A | 2014-10-01 | 2014-10-01 | 20 | +---------+------------+------------+-------------+ 4 rows in set (0.00 sec)在条件INNER JOIN条款g2.id = g1.id + 1让你的当前行与下一行比较的库存表,当然,有一个前提是有在ID列中没有空白。 如果您无法避免间隙,您可以创建一个额外的列,例如,
seq
维护行的顺序,以便您应用此技术。
在本教程中,您学习了如何使用自连接技术比较同一表中的连续行。