1

テーブルで重複する値を検索し、それらの重複 (または重複のセットの 1 つだけ) を結果セットとして返す方法を探しています。

たとえば、次のデータがあるとします。

ユーザーID | 準固有 ID
1 | 12345
2 | 21345
3 | 54321
4 | 41235
5 | 12345
6 | 21345

次のいずれかを返す必要があります。

12345
12345
21345
21345

または:

12345
21345

私はグーグルで試してみましたが、不足し続けています。何か助けてください。

4

3 に答える 3

3

申し訳ありませんが、以前は時間が足りなかったので、答えを説明できませんでした。最初のクエリは、同じ semi_unique_id をグループ化し、重複するものだけを返します。

SELECT semi_unique_id
FROM your_table
GROUP BY semi_unique_id
HAVING COUNT(semi_unique_id) > 1

クエリで uid も取得したい場合は、簡単に追加できます。

SELECT uid,
       semi_unique_uid
FROM   your_table
GROUP BY
       semi_unique_id,
       uid
HAVING COUNT(semi_unique_id) > 1

最後に、返された行ごとの重複数を知りたい場合は、次のようにします。

SELECT uid,
       semi_unique_uid,
       COUNT(semi_unique_uid) AS unique_id_count
FROM   your_table
GROUP BY
       semi_unique_id,
       uid
HAVING COUNT(semi_unique_id) > 1
于 2013-01-24T02:37:44.023 に答える
3

各行を取得するには、ウィンドウ関数を使用できます。

select t.*
from (select t.*, count(*) over (partition by [semi-unique id]) as totcnt
      from t
     ) t
where totcnt > 1

インスタンスを 1 つだけ取得するには、次のようにします。

select t.*
from (select t.*, count(*) over (partition by [semi-unique id]) as totcnt,
             row_number() over (partition by [semi-unique id] order by (select NULL)
                               ) as seqnum
      from t
     ) t
where totcnt > 1 and seqnum = 1

このアプローチの利点は、id だけでなく、すべての列を取得できることです (それが役立つ場合)。

于 2013-01-24T02:44:23.830 に答える
1
SELECT t.semi_unique_id AS i
FROM   TABLE t
GROUP BY
       t.semi_unique_id
HAVING (COUNT(t.semi_unique_id) > 1)

これをsql-serverで試してください

于 2013-01-24T05:05:56.827 に答える