1

私はそのようなテーブルを持っています:

Table eventlog
user  |  user_group  | event_date |  event_dur.
----     ----------    ---------     ----------
xyz         1           2009-1-1        3.5
xyz         2           2009-1-1        4.5
abc         2           2009-1-2        5
abc         1           2009-1-2        5

上記のサンプルデータでは、信頼できるのは日付とユーザーだけであることに注意してください。私の責任の90%であるオーバーサイトを通じて、私はユーザーが毎日のエントリを複製できるようにすることができました。重複が期間の更新を目的とした場合もあれば、その日に使用していたuser_groupを変更しようとした場合もあれば、両方の場合もあります。

幸いなことに、(これは古いシステムへの更新であるため)レコードが正しいというかなり強い考えがあります。(基本的に、これはすべて、古いDBと新しいDBをシームレスにマージする試みとして発生しました)。

残念ながら、これは多かれ少なかれ手作業で行う必要があります。そうしないと、一方の側にのみ存在し、もう一方の側には存在しないデータが失われるリスクがあります。

簡単に言うと、特定の日付にユーザーのエントリが複数あるすべてのレコードを返す適切なMySQLクエリを見つけようとしています。私はGROUPBYとHAVINGに苦労してきましたが、私が得ることができる最善の方法は、重複ごとに2つの重複のうちの1つのリストです。これは、間違いであることが確実にわかっている場合に役立ちます。

これが私が来た最も近いものです:

SELECT *
FROM eventlog
GROUP BY event_date, user
HAVING COUNT(user) > 1
ORDER BY event_date, user

これに関するどんな助けも非常に役に立ちます。必要に応じて、重複の各セットのユーザー/日付のリストを持っているので、手作業で400個すべてを削除できますが、一度にすべてを表示したいと思います。

ありがとう!

4

3 に答える 3

1

これは機能しますか?

SELECT event_date, user
FROM eventlog
GROUP BY event_date, user
HAVING COUNT(*) > 1
ORDER BY event_date, user

私を失望させているのは、あなたが持っているCOUNT(user)句です。

于 2009-09-08T04:52:58.543 に答える
1

GROUP_CONCAT関数を使用して、重複のすべてのフィールド値を一覧表示できますが、それでもセットごとに1つの行を取得します。

于 2009-09-08T06:45:49.967 に答える
1

私はこれがうまくいくと思います(テストされていません)

SELECT  *
FROM    eventlog e1
WHERE   1 <
(
    SELECT  COUNT(*)
    FROM    eventlog e2
    WHERE   e1.event_date = e2.event_date
    AND     e1.user = e2.user
)
-- AND [maybe an additionnal constraint to find the bad duplicate]
ORDER BY event_date, user;
;
于 2009-09-08T08:08:47.170 に答える