1

同様:テーブル内の重複行を削除するにはどうすればよいですか

これは不可能だと感じており、退屈な方法でやらなければなりませんが、皆さんの言うことを見ていきます.

約 400 万行、50 奇数列のかなり大きなテーブルがあります。ユニークであるはずの列、エピソードがあります。残念ながら、Episode は一意ではありません。この背後にあるロジックは、Episode が繰り返されているにもかかわらず、行の他のフィールドが時々変更されるということです。ただし、実際には一意の列、Sequence があります。

同じエピソード番号を持つ行を特定したいのですが、それらの間で何かが異なります (シーケンスは別として)。これにより、これが発生する頻度と、許可する価値があるかどうか、または行を削除して無視する必要があるかどうかを判断できます。軽度の不一致の可能性。

私の希望は、エピソード番号を示すテーブルを作成し、各テーブル列の列を作成して、両側の値が異なる場所を識別することです。

SELECT Episode, 
       CASE WHEN a.Value1<>b.Value1 
            THEN a.Value1 + ',' + b.Value1 
            ELSE '' END AS Value1,
       CASE WHEN a.Value2<>b.Value2 
            THEN a.Value2 + ',' + b.Value2 
            ELSE '' END AS Value2
FROM Table1 a INNER JOIN Table1 b ON a.Episode = b.Episode
WHERE a.Value1<>b.Value1
      OR a.Value2<>b.Value2

(これはおそらく穴だらけですが、変更された値を強調するというアイデアが実現することを願っています。)

残念ながら、50 列に対してそのようなクエリを作成するのはかなり面倒です。明らかに、一度しか使用されない場合は、厳密に堅固である必要はありませんが、同時に、コードをコピーパスタすればするほど、何かが見落とされる可能性が高くなります。私の知る限り、Sequence は個別であり、同じ行が異なるものとしてポップアップするため、DISTINCT を検索することはできません。

誰にも役立つクエリや関数がありますか? 上記と同様のクエリ結果を出力するもの、または別のソリューションのいずれか? 私が言ったように、今は重複を削除しようとしているわけではなく、単にそれらを特定するだけです.

4

6 に答える 6

1

使用する:

  SELECT DISTINCT t.*
    FROM TABLE t
ORDER BY t.episode --, and whatever other columns

DISTINCTGROUP BY関連するすべての列でa を書くことの省略形です。この場合、すべての列でグループ化すると、エピソード列に関連付けられたレコードの一意のグループがすべて表示されます。そのため、重複の正確な数が得られないリスクがありますが、その時点で何を削除するかを決定できるように、値が得られます。

50 列は多いですが、ORDER BY を設定すると、リストを目で追うことができます。もう 1 つの方法は、ORDER BY を構築したくない場合にデータを Excel にエクスポートし、Excel の並べ替えを使用することです。

更新 シーケンス列が一意の値になることはわかりませんでしたが、その場合、表示するすべての列のリストを提供する必要があります。いいえ:

  SELECT DISTINCT t.episode, t.column1, t.column2 --etc.
    FROM TABLE t
ORDER BY t.episode --, and whatever other columns

を使用できる表記法はありませんt.* but not this one column。シーケンス列が出力から省略されると、重複が明らかになります。

于 2009-11-25T04:17:35.087 に答える
1

50 列すべてを入力する代わりに、次のようにすることができます。

select column_name from information_schema.columns where table_name = 'your table name'

次に、シーケンスを除くすべての列でグループ化し、カウント > 1 でフィルタリングするクエリにそれらを貼り付けます。

select 
  count(episode)
, col1
, col2
, col3
, ...
from YourTable
group by
  col1
, col2
, col3
, ...
having count(episode) > 1

これにより、同じエピソード番号を持つすべての行のリストが表示されます。(ただし、シーケンス番号もエピソード番号自体もありません)。ここに問題があります。ここにはこれらの列がないため、シーケンスとエピソードを除くすべての列で、この結果セットを YourTable に結合する必要があります。

ここでは、SQL を使用してより多くの SQL を生成するのが好きです。これで始められるはずです:

select 't1.' + column_name + ' = t2.' + column_name
from information_schema.columns where table_name = 'YourTable'

これらの結合パラメーターをこのクエリにプラグインします。

select * from YourTable t1 
inner join (
select 
      count(episode) 'epcount'
    , col1
    , col2
    , col3
    , ...
    from YourTable
    group by
      col1
    , col2
    , col3
    , ...
    having count(episode) > 1
) t2 on 

...plug in all those join parameters here...
于 2009-11-25T06:25:14.767 に答える
0
select count distinct ....

推測せずに表示する必要があります。テーブル定義を表示して列を取得できるため、シーケンス以外の列をコピーして貼り付けることができます。

于 2009-11-25T04:06:46.967 に答える
0

私はこのようなものがあなたが望むものだと思います:

select *
from t
where t.episode in (select episode from t group by episode having count(episode) > 1)
order by episode

これにより、エピソードが重複しているすべての行が得られます。重複していない行はかなりはっきりと突き出ているはずです。

もちろん、何らかのスクリプトにアクセスできる場合は、スクリプトを記述してクエリを生成することもできます。それはかなり簡単に思えます。(つまりdescribe t、すべてのフィールドを反復処理します)。

また、クエリには のような何らかの順序がFROM Table1 a INNER JOIN Table1 b ON a.Episode = b.Episode AND a.Sequence < b.Sequence必要です。そうしないと、重複した非重複が発生します。

于 2009-11-25T04:33:45.990 に答える
0

Poniesが引き起こした比較的単純な解決策:

SELECT  t.*
FROM    Table t
    INNER JOIN ( SELECT episode
                 FROM   Table
                 GROUP BY Episode
                 HAVING COUNT(*) > 1
               ) AS x ON t.episode = x.episode

次に、Excel にコピーして貼り付け、これを結果セット全体の条件付き強調表示として使用します。

=AND($C2=$C1,A2<>A1)

C列はエピソードです。このようにして、データが上の行と異なる場合に視覚的なハイライトを取得します (両方の行のエピソードの値が同じである限り)。

于 2009-11-25T04:39:44.683 に答える
0

ハッシュ値が同一性の定義を反映するように設計された、各行のハッシュ キーを生成して保存します。行の複雑さによっては、ハッシュの更新が行の変更の単純なトリガーになる場合があります。

ハッシュキーの重複を照会します。これは、「非常に可能性が高い」同一の行です。

于 2009-11-25T06:31:41.977 に答える