3

TABLEA以下のようなデータを含むテーブルがあります

field1 field2 field3.......field16
123    10-JAN-12 0.8.......ABC
123    10-JAN-12 0.8.......ABC
.
.
.
123    10-JAN-12 0.7.......ABC
245    11-JAN-12 0.3.......CDE
245    11-JAN-12 0.3.......CDE
245    11-JAN-12 0.3.......XYZ
...
<unique rows>

私がするとき

select field1, field2, ...field16 
  from TABLEA

M レコードを取得し、

select distinct field1, field2...field16 
  from TABLEA

M-xレコードを取得します。ここMで、 は数百万単位でxあり、はるかに小さい # です。

x レコードを取得する SQL を作成しようとしています (最終的には、カウントを取得するだけです)。次のようなすべての Set 演算子キーワードを試しました

select field1...field16 
 from TABLEA 
 EXCEPT 
 select distinct field1..field16 
   from TABLEA  

またはUNION ALL、EXCEPT の代わりに使用します。しかし、どれも を返さxず、代わりにすべて 0 行を返します。

4

3 に答える 3

3

区別されない行を選択できます

 SELECT field1, ... , field16
   FROM tablea
  GROUP BY field1, ... , field16
 HAVING count(*) > 1

編集:別のアプローチは、分析関数を使用して、すべての列ROW_NUMBER()で分割することです。fieldフィールドの特定のセットの最初の (つまり、個別の) 行には、2 番目 = 2、3 番目 = 3 などがあります。したがって、行を でROW_NUMBER = 1選択できます。xWHERE ROW_NUMBER > 1

CREATE TABLE tablea (
    field1 NUMBER, field2 DATE,  field3 NUMBER, field16 VARCHAR2(10)
);

INSERT INTO tablea VALUES (123, DATE '2012-01-10', 0.8, 'ABC');
INSERT INTO tablea VALUES (123, DATE '2012-01-10', 0.8, 'ABC');
INSERT INTO tablea VALUES (123, DATE '2012-01-10', 0.7, 'ABC');
INSERT INTO tablea VALUES (245, DATE '2012-01-11', 0.3, 'CDE');
INSERT INTO tablea VALUES (245, DATE '2012-01-11', 0.3, 'CDE');
INSERT INTO tablea VALUES (245, DATE '2012-01-11', 0.3, 'XYZ');

重複する行を選択するにはx:

SELECT *
  FROM (
        SELECT field1, field2, field3, field16,
               ROWID AS rid,
               ROW_NUMBER() OVER (PARTITION BY 
               field1, field2, field3, field16 ORDER BY ROWID) as rn
          FROM tablea
        )
  WHERE rn > 1;

 123 10.01.2012 0.8 ABC AAAJ6mAAEAAAAExAAB 2
 245 11.01.2012 0.3 CDE AAAJ6mAAEAAAAExAAE 2
于 2013-01-08T17:32:59.757 に答える
1

上記で投稿した独自の「Except」クエリで、必要なものが得られます。ただし、'Except Distinct' がデフォルトであるため、except に 'ALL' キーワードを含める必要があります。そのため、クエリ自体に以下の ALL キーワードを追加しました。

TABLEA から field1...field16 を選択します EXCEPT ALL TABLEA から個別の field1..field16 を選択します

Mx のレコードのカウントが必要な場合は、上記のクエリを別のクエリの FROM 句でサブクエリにし、その外側のクエリにカウントを含めると、以下に示すようにカウントが取得されます。

カウント (*) を選択 (TABLEA から field1...field16 を選択 EXCEPT ALL TABLEA から個別の field1..field16 を選択
) B

これがあなたが探しているものだと思います。

幸運を

于 2014-01-25T13:57:30.860 に答える
0

列の選択が同じである場合、個別にない行の結果の数を取得することはできません。Distinct はすべての結果の 'DISTINCT' の可能性を示しているため、union all を実行するとそれが繰り返されるだけであり、行を制限しているため、except では何も見つかりません。あなたは何をしようとしていますか?特異点が発生している場所を数えてみてください。Wolfgang から得た回答は、すでにそれを行っています。

declare @Table Table ( personID int identity, person varchar(8));

insert into @Table values ('Brett'),('Brett'),('Brett'),('John'),('John'),('Peter');


-- gives me all results
select person
from @Table

-- gives me distinct results (no repeats)
Select distinct person
from @Table


-- gives me nothing as nothing exists that is distinct that is not in total
select person
from @Table 
except 
select distinct person
from @Table

-- shows me counts of rows repeated by pivoting on one column and counting resultant rows from that.  Having clause adds predicate specific logic to hunt for.
-- in this case duplicates or rows greater than one
Select person, count(*)
from @Table 
group by person
having count(*) > 1 

それがあなたが意味するものである場合、編集して合計との差を得ることができます:

 with dupes as 
    (
    Select count(*) as cnts, sum(count(*)) over() as TotalDupes
    from @Table 
    group by person 
    having count(*) > 1 -- dupes are defined by rows repeating 
    ) 
, uniques as 
    (
    Select count(*) as cnts, sum(count(*)) over() as TotalUniques
    from @Table 
    group by person 
    having count(*) = 1  -- non dupes are rows of only a single resulting row
    )
select distinct TotalDupes - TotalUniques as DifferenceFromRepeatsToUnqiues
from Dupes, Uniques
于 2013-01-08T19:02:07.223 に答える