MySQL5.1には次のようなテーブルがあります。
+--------------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------+------+-----+---------+----------------+
| log_id | int(11) | NO | PRI | NULL | auto_increment |
| date | datetime | NO | MUL | NULL | |
| date_millis | int(3) | NO | | NULL | |
| eib_address | varchar(20) | NO | | NULL | |
| ip_address | varchar(15) | NO | | NULL | |
| value | decimal(20,10) | NO | MUL | NULL | |
| application | tinyint(4) | NO | | NULL | |
| phys_address | varchar(20) | NO | | NULL | |
| orig_log_id | bigint(20) | NO | | NULL | |
+--------------+----------------+------+-----+---------+----------------+
この表ではlog_id
、orig_log_id
は常に一意です。ただし、2つの行が他のフィールドの値と重複している可能性があります。フィールドを無視する*log_id
と、問題は、2つの行が他のすべての列で同一である可能性があるが、の値が異なることですvalue
。date
2つ(またはそれ以上)の行の、、およびの値が同じであるが、、date_millis
およびeib_address
の値が異なる場合を識別するためvalue
に、正しいSQLクエリを見つけようとしていlog_id
ますorig_log_id
。これまでのところ、前の文の最初の句を実行するクエリを思い付くことができました。
SELECT main.*
FROM sensors_log main
INNER JOIN
(SELECT date, date_millis, eib_address
FROM sensors_log
GROUP BY date, date_millis, eib_address
HAVING count(eib_address) > 1) dupes
ON main.date = dupes.date
AND main.date_millis = dupes.date_millis
AND main.eib_address = dupes.eib_address;
value
しかし、いつ違うのかわからないようです。私は少なくともAND main.value != dupes.value
、ON
節に投げ込むだけではそれができないことを知っています!