2017-10-15 14 views
4

テーブルという名前のテーブルがあり、このテーブルには多くのレコードがあります。ここではいくつかのサンプルデータは、次のとおりです。2つの列に基づいて重複レコードのみを表示するSqlクエリ

fullname | address | city 
----------------------------- 
AA   address1 City1 
AA   address3 City1 
AA   address8 City2 
BB   address5 City2 
BB   address2 City1 
CC   address6 City1 
CC   address7 City2 
DD   address4 City1 

私は列fullnamecityに基づいてのみ、重複したレコードを表示しますSQL ServerのでSELECTクエリを持っていると思います。与えられたデータと条件を考慮すると、最初の2つのレコードだけが重複しています。だから私の予想出力は以下のようにする必要があります:

fullname | address | city 
----------------------------- 
AA   address1 City1 
AA   address3 City1 

この出力を得るために、私はこのクエリを書かれている:

select fullname, city from employee group by fullname, city having count(*)>1 

あなたが見ることができるように、それは2つの列のみを選択し、したがって、それが与えています私は以下のようなクエリを再作成する場合は

fullname | city 
------------------ 
AA   City1 

:出力を次

select fullname, city, address from employee group by fullname, city, address 
having count(*)>1 

残念ながらそれは表示されますレコードがありません!誰かが正しい結果を得るために正しいクエリを書くのを助けてくれますか?

答えて

3

代わりにあなたが他の列にアクセスするために、ウィンドウ集合体として使用することができますグループ化COUNT

SELECT fullname, 
     address, 
     city 
FROM (SELECT *, 
       COUNT(*) OVER (PARTITION BY fullname, city) AS cnt 
     FROM employee) e 
WHERE cnt > 1 
1

上記の回答に同意します。 しかし、あなたは、あなたがして、グループの後に都市とフルネームでそれ自体に参加したし、その後アドレス

Select employee.* from employee 
    join (select fullname, city from employee group by fullname, city having count(*)>1) q1 
    on q1.fullname = employee.fullname and q1.city = employee.city 
1

を試してみてください得ることができるすべてのDBで正常に動作しない場合があります、Windowsの機能を使用しない場合次のコードは:あなたは一意のIDを持っているか、アドレスが常に異なる場合

 create table ##Employee 
     (Fullname varchar(25), 
     Address varchar(25), 
     City varchar(25)) 

     insert into ##Employee values 
    ( 'AA',   'address1', 'City1') 
    ,( 'AA',   'address3', 'City1') 
    ,( 'AA',   'address8', 'City2') 
    ,( 'BB',   'address5', 'City2') 
    ,( 'BB',   'address2', 'City1') 
    ,( 'CC',   'address6', 'City1') 
    ,( 'CC',   'address7', 'City2') 


     select E.* from ##Employee E 
     cross apply(
     select Fullname,City,count(Fullname) cnt from ##Employee 
     group by Fullname,City 
     having Count(Fullname)>1)x 
     where E.Fullname=x.Fullname 
     and E.City=x.City 
+0

私はあなたが新しいテーブルを作成した理由はわかりません。既存のテーブル名を使用することができます。 –

1

、あなたが試すことができます:

select e.* 
from employee e 
where exists (select 1 
       from employee e2 
       where e2.fullname = e.fullname and e2.city = e.city and 
        e2.address <> e.address -- or id or some other unique column 
      ); 

私はおそらくとなるだろうが、いくつかの状況下では、これはより高速です(特に、インデックスがemployee(fullname, city, address)の場合)。

0

ここでは、溶液で行く:

DECLARE @Employee TABLE 
     (
      Fullname VARCHAR(25), 
      [Address] VARCHAR(25), 
      City VARCHAR(25) 
     ) 

     INSERT INTO @Employee VALUES 
     ('AA', 'address1', 'City1') 
     ,('AA', 'address1', 'City1') 
     ,('AA', 'address3', 'City1') 
     ,('AA', 'address8', 'City2') 
     ,('BB', 'address5', 'City2') 
     ,('BB', 'address2', 'City1') 
     ,('CC', 'address6', 'City1') 
     ,('CC', 'address7', 'City2') 

    ;WITH cte AS (
       SELECT *, 
         ROW_NUMBER() OVER(PARTITION BY FullName, [Address], [City] ORDER BY Fullname) AS sl, 
         HashBytes('MD5', FullName + [Address] + [City]) AS RecordId 
       FROM @Employee AS e 
      ) 

     SELECT c.FullName, 
      c.[Address], 
      c.City 
     FROM cte    AS c 
      INNER JOIN cte AS c1 
        ON c.RecordId = c1.RecordId 
     WHERE c.sl = 2 

結果:

FullName Address  City 
AA   address1 City1 
AA   address1 City1 
関連する問題