2016-06-23 14 views
0

私は自分のアプリケーションで潜在的なバグを見つけようとしています.2つの列の重複データであるuservalueで示される重複したイベントがユーザーに記録されているかどうかを確認したいのですが、列はわずかに異なるメタデータを持つことができます。単一のSQLクエリでそのような重複を識別する方法はありますか?隣接する重複行を検出するSQL(列のサブセットに値で示される重複)?

+2

可能な重複[Selectステートメントは、特定のフィールドの重複を見つけるために](http://stackoverflow.com/questions/4434118/select-:「tはあなたが 『隣接』によって何を意味するかクリアし、ここでのソリューションです。特定のフィールドに重複するステートメント) – Adam

+1

隣接していますか?次に、LAGまたはLEADを使用して、前または次のレコードを表示できます。または、EXISTS節を使用して、同じユーザーまたは値で同じ分単位で別のレコードが存在するレコードを検索します。 –

答えて

1

Windowここで関数を使用できます。特にlagまたはleadは、前回または次回の出現を希望する場合には省略されます。

このクエリは、lagを使用していますが、安全にleadによって変更することができます。

WITH event_with_lag_data AS (
SELECT user, value, value_ts, 
    lag(user) over (order by value_ts) as prev_user, 
    lag(value) over (order by value_ts) as prev_value 
FROM event_data 
) 
SELECT user, value, value_ts 
FROM event_with_lag_data 
WHERE user = prev_user AND value = prev_value 

value_tsは順序付け列です。イベントは日付/時刻順に並べられていると仮定します。
あなたが平等のためにテストするために複数の列を持っている場合は、ちょうどそれがにISNから2列に基づいてすべての重複を見つけるために探している場合はlag部分に、最終的なwhere一部

0

に多くの行を追加するだけです

WITH duplicates AS (
     select 
     user, 
     value, 
     COUNT(*) AS COUNT 
     FROM event_data 
     GROUP BY 
     user, 
     value 
    ) 

    SELECT 
     user, 
     value 
    FROM duplicates 
    WHERE COUNT > 1 
関連する問題