2

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_idorig_log_idは常に一意です。ただし、2つの行が他のフィールドの値と重複している可能性があります。フィールドを無視する*log_idと、問題は、2つの行が他のすべての列で同一である可能性があるが、の値が異なることですvaluedate2つ(またはそれ以上)の行の、、およびの値が同じであるが、、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.valueON節に投げ込むだけではそれができないことを知っています!

4

2 に答える 2

8

あなたが作ろうとしているよりも少し簡単だと思います。これを試して:

SELECT *
  FROM SENSORS_LOG s1
  INNER JOIN SENSORS_LOG s2
    ON (s2.DATE = s1.DATE AND
        s2.DATE_MILLIS = s1.DATE_MILLIS AND
        s2.EIB_ADDRESS = s1.EIB_ADDRESS)
  WHERE s1.VALUE <> s2.VALUE OR
        s1.LOG_ID <> s2.LOG_ID OR
        s1.ORIG_LOG_ID <> s2.ORIG_LOG_ID;

共有してお楽しみください。

于 2011-03-23T16:10:07.077 に答える
1

たぶん私は問題を間違えましたが、あなたはこのように実行することはできませんCOUNTか?

SELECT date, date_millis, eib_address, count(*) as nr_dupes
FROM sensors_log
GROUP BY date, date_millis, eib_address
HAVING count(*) > 1

また

SELECT date, date_millis, eib_address, 
       group_concat(value), group_concat(log_id), group_concat(orig_log_id)
FROM sensors_log
GROUP BY date, date_millis, eib_address
HAVING count(*) > 1
于 2011-03-23T16:37:04.707 に答える