場合によっては、連続する行を比較したり、各行をMySQLテーブルの前の行と比較したりする必要があります。この記事では、自己結合を使用して同じテーブルの2つの行を比較する方法を見ていきます。これを使用して、連続する行を比較したり、2つの行の違いを取得したりできます。
MySQLで連続する行を比較する方法
次のテーブルがあるとしますsales(id、order_date、amount) 金額の列には、累積売上データの合計が含まれています。
mysql> create table sales(id int auto_increment primary key,
order_date date, amount int);
mysql> insert into sales(order_date, amount)
values('2020-10-01',100),
('2020-10-02',125),
('2020-10-03',140),
('2020-10-04',160);
mysql> select * from sales;
+------+------------+--------+
| id | order_date | amount |
+------+------------+--------+
| 1 | 2020-10-01 | 100 |
| 2 | 2020-10-02 | 125 |
| 3 | 2020-10-03 | 140 |
| 4 | 2020-10-04 | 160 |
+------+------------+--------+ ボーナスリード:MySQLで2つの列を比較する方法
この例では、毎日の売り上げを調べたい場合は、各行の金額の値を前の行の金額と比較する必要があります。各行を前の行と比較するためのSQLクエリは次のとおりです。
mysql> SELECT
g1.id, g1.order_date,g1.amount,
(g2.amount - g1.amount) AS daily_amount
FROM
sales g1 INNER JOIN sales g2 ON g2.id = g1.id + 1;
+------+------------+--------+--------------+
| id | order_date | amount | daily_amount |
+------+------------+--------+--------------+
| 1 | 2020-10-01 | 100 | 25 |
| 2 | 2020-10-02 | 125 | 15 |
| 3 | 2020-10-03 | 140 | 20 |
+------+------------+--------+--------------+
> 上記のクエリでは、INNERJOIN条件g2.id=g1.id + 1を使用してsalesテーブルをそれ自体と結合します。これにより、各行を前の行と比較できます。
ボーナスリード:MySQLでN行ごとに取得する方法
この条件は、id列に連続した番号があるという事実に依存することに注意してください。ほとんどのテーブルには自動インクリメントの主キー列があるため、ほとんどの場合に機能するはずです。他の定数が異なる場合は、それに応じてINNERJOIN条件を変更できます。
うまくいけば、MySQLの同じテーブルの2つの行を簡単に比較できるようになりました。
Ubiqを使用すると、データを簡単に視覚化し、リアルタイムのダッシュボードで監視できます。 Ubiqを無料でお試しください。