7

Find duplicate entries in a columnOracle: find duplicate rows in select query を検索しましたが、答えが得られなかったようです...

こんな感じのデータがあります

columnA    columnB    columnC
1111111    emailID1   true
1111111    emailID2   false
1111222    emailID3   true
1111339    emailID4   true
2384398    emailID5   true

columnA では同じ値を持つが、columnB や C では異なる可能性があるこれらの列のみを表示したいと思います。

columnA    columnB    columnC
1111111    emailID1   true
1111111    emailID2   false

>1 を使用しても、実際にはこれを捉えられないようです。何かアイデアはありますか? ありがとう。

4

7 に答える 7

7

使い方having count(*) > 1はパズルの半分にすぎません。残りの半分は、対応する行を取得しています。

次のように実行できます。

SELECT *
FROM MyTable
WHERE ColumnA IN (
    SELECT ColumnA FROM MyTable GROUP BY ColumnA HAVING COUNT(*) > 1
)
于 2013-08-29T01:48:06.627 に答える
0
SELECT T.columnA, S.columnB, S.columnC FROM
(
SELECT columnA FROM someTable 
GROUP BY columnA
HAVING COUNT(*) > 1
) T INNER JOIN someTable S ON T.columnA = S.columnA 
于 2013-08-29T01:47:56.703 に答える
0

これは、分析関数を使用して行うことができます。最小値と最大値を見つけて、それらが異なる行を返します。

select columnA, columnB, columnC
from (select t.*,  min(t.columnC) over (partition by columnA, columnB) as minC,
             max(t.columnC) over (partition by columnA, columnB) as maxC
      from t
     ) t
where minC <> maxC;
于 2013-08-29T01:48:24.207 に答える
0

1 つの列に複数のキーが発生する可能性があるデータベースで一意の ID を持つエントリを探している場合、それらを見つける簡単な方法は、以下に説明するような 2 つのテーブルを作成することです。

ここで: TICKETID は主キーであり、TKTNUMBER は複数回発生する可能性があります。

CREATE TABLE TEMP
(
   TICKETID    FLOAT,
   TKTNUMBER   FLOAT
);

CREATE TABLE TEMP2
(
   TKTNUMBER   FLOAT,
   COUNTER     INTEGER
);

COUNT(TKTNUMBER)>1 の TKTNUMBERS のみを調べて、すべての TICKETID と TKTNUMBER を入力します。

INSERT INTO TEMP
   SELECT 
       TICKETID, 
       TKTNUMBER
   FROM YOUR_TABLE
   WHERE TKTNUMBER IN (  
            SELECT TKTNUMBER
            FROM YOUR_TABLE
            HAVING COUNT (TKTNUMBER) > 1
            GROUP BY TKTNUMBER);

最後に、カウンタを表示するには、上記と同じ方法で TKTNUMBER と COUNT を入力します。

INSERT INTO TEMP2
    SELECT 
        TKTNUMBER, 
        COUNT (TKTNUMBER) AS COUNTER
    FROM YOUR_TABLE
    HAVING COUNT (TKTNUMBER) > 1
    GROUP BY TKTNUMBER
    ORDER BY 2 DESC

次のように選択できます (tktnumber で 2 つのテーブルを結合することにより)。

SELECT 
    T1.TICKETID,
    T1.TKTNUMBER,
    T2.COUNTER
FROM 
    TEMP T1 INNER JOIN 
    TEMP2 T2 ON 
        T2.TKTNUMBER = T1.TKTNUMBER
ORDER BY T2.COUNTER DESC
于 2016-05-23T09:48:23.890 に答える
0

このスレッドは古いかもしれませんが、重複レコードを見つけるためのより優れた/効率的なソリューションをすべての人に更新する価値があります。パーティションを使用して、一致する列 (内部結合を使用せずに必要な数の列) で重複レコードを見つけることができます。

SELECT  *
FROM    (
        SELECT  t.*, ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY your_key_column) AS duplicate_count
        FROM    yourtable t
        )
WHERE   duplicate_count > 1 --get duplicate records for the matching value in column1 and column2

ここで@Quassnoiからの元の回答を参照してください。彼に感謝します。パーティションを使用した非常に賢い解決策です。

于 2015-04-23T04:31:18.527 に答える