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 行为例。它们显然都指的是同一个人,但它们只是部分重复。在这两个中,我希望我的 SELECT 语句中包含第 1 行,因为它在每列中包含最多的数据。第 3 行和第 4 行也是如此。第 3 行是我想要包含的行。对于第 5 行和第 6 行,选择哪一个并不重要,因为它们都是完全重复的。第 7 行将默认包括在内,因为它是不同的(意味着 A、B 和 C,而不仅仅是 A 和 B)。

这是我尝试过的:

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 回答