1

さて、いくつかのジャンク データを含むテーブルがあり、一意の識別子の列はありません。私が扱っているテーブルの例を挙げましょう:

     A    |   B   |  C   |        D         |   E  |
  --------------------------------------------------
1.  Fiona | Smith | NULL | 2152 Cherry Lane | CA   |
2.  Fiona | Smith | NULL | NULL             | NULL |
3.  Bill  | NULL  | ACME | 2903 Center Road | WA   |
4.  Bill  | NULL  | ACME | NULL             | NULL |
5.  NULL  | NULL  | ABC  | 2300 Water St    | PA   |
6.  NULL  | NULL  | ABC  | 2300 Water St    | PA   |
7.  NULL  | NULL  | NULL | 3455 B Street    | CO   |

個別の行のみを取得する SELECT ステートメントを作成する必要があります。たとえば、行 1 と 2 を見てみましょう。どちらも明らかに同じ人物を指していますが、部分的にしか重複していません。これら 2 つのうち、各列に最も多くのデータが含まれている行 1 を SELECT ステートメントに含める必要があります。行 3 と 4 についても同様です。行 3 は、含めたい行です。行 5 と 6 については、両方とも完全に重複しているため、どちらを選択しても問題ありません。行 7 は別個であるため、デフォルトで含まれます (A と B だけでなく、A、B、C を意味します)。

これが私が試したことです:

SELECT A, B, C = MAX(D), MAX(E), 
FROM dbo.Data
GROUP BY A, B, C;

これは私が望む一意の行を取得しているようですが、データは何らかの形で間違った列に配置されています。

4

2 に答える 2

2
WITH recordsList
AS
(
    SELECT  A, B, C, D, E,
            ROW_NUMBER() OVER (PARTITION BY A,B,C
                               ORDER BY 
                                 CASE WHEN D IS NULL 
                                      THEN 0
                                      ELSE 1 END DESC) x
   FROM table1
)
SELECT A,B,C,D,E
FROM recordsList
WHERE x = 1
于 2013-01-22T04:33:01.530 に答える
2

このアプローチでは、D と E が等しいものとして扱われます。

DECLARE @x TABLE
(
  A VARCHAR(32), 
  B VARCHAR(32), 
  C VARCHAR(32), 
  D VARCHAR(32), 
  E VARCHAR(32)
);

INSERT @x VALUES
('Fiona', 'Smith', NULL,   '2152 Cherry Lane',  'CA'),
('Fiona', 'Smith', NULL,   NULL,                NULL),
('Bill',  NULL,    'ACME', '2903 Center Road',  'WA'),
('Bill',  NULL,    'ACME', NULL,                NULL),
(NULL  ,  NULL,    'ABC',  '2300 Water St',     'PA'),
(NULL  ,  NULL,    'ABC',  '2300 Water St',     'PA'),
(NULL  ,  NULL,    NULL,   '3455 B Street',     'CO'),
('Bob',   'Barker',NULL,   NULL,                NULL),
('Bob',   'Barker',NULL,   NULL,                'NY');

;WITH x AS
(
  SELECT A,B,C,D,E, rn = ROW_NUMBER() OVER 
  (
    PARTITION BY A,B,C
    ORDER BY COALESCE(LEN(LEFT(D,1)),0) + COALESCE(LEN(LEFT(E,1)),0) DESC
  )
  FROM @x
)
SELECT A,B,C,D,E
FROM x WHERE rn = 1;
于 2013-01-22T04:43:35.803 に答える