0

私は人のテーブルを持っています:

Phone     | Id1 | Id2 | Fname | Lname| Street
111111111 | A1 | 1000 | David | Luck | 123 Main Street
111111111 | A2 | 1001 | David | Luck | blank
111111111 | A3 | 1002 | David | Luck | blank
222222222 | B1 | 2000 | Smith | Nema | blank
333333333 | C1 | 3000 | Lanyn | Buck | 456 Street

以下の結果が欲しいです。

Phone     | Id1 | Id2 | Fname | Lname| Street
111111111 | A1 | 1000 | David | Luck | 123 Main Street
222222222 | B1 | 2000 | Smith | Nema | blank
333333333 | C1 | 3000 | Lanyn | Buck | 456 Street

番地情報を持つ重複電話レコードを選択するには、どの SQL2008 クエリを使用する必要がありますか? ありがとう

4

4 に答える 4

0

特定の行を選択したい。これは、ウィンドウ関数row_number()が最も役立つ場所です。order by課題は、適切な句を見つけることです。

select p.Phone, p.Id1, p.Id2, p.Fname, p.Lname, p.Street
from (select p.*,
             row_number() over (partition by phone
                                order by (case when street is not null then 0 else 1 end),
                                         id2
                               ) as seqnum
      from person p
     ) p
where seqnum = 1

この関数は、(句に基づいて)row_number()の同じ値を持つ行に連続番号を割り当てます。通りが空白でなく、最小のものは 1 の値を取得します。存在しない場合は、最小の id2 を持つものが値を取得します。それは、外側のフィルターによって選択されたものです。phonepartition byid2

于 2013-06-12T18:23:10.423 に答える
0
SELECT a.*
FROM person a
JOIN ( SELECT Phone, Street, 
       ROW_NUMBER() OVER (PARTITION BY Phone
       ORDER BY CASE WHEN street is null then 0 else 1 end) as 'Rank'
       FROM Person
     )b
ON a.Phone = b.Phone
AND a.Street = b.Street
WHERE b.Rank = 1
于 2013-06-12T18:33:41.097 に答える
-1

これを試して

select a.* from Table1 a
inner join 
(
   select distinct Phone  from Table1
   group by Phone
) as b
on a.Phone= b.Phone
于 2013-06-12T18:04:41.710 に答える