在顶部选择Distinct result但返回所有结果

时间:2017-07-26 01:41:31

标签: sql sql-server distinct rank partition

我有一张包含以下结构和数据的表......

email      name address
abc@a.com  ab    us
abc@a.com  de    fr
xyz@x.com  bv    dc
efg@e.com  cd    mm
xyz@x.com  bv    dc
efg@e.com  cd    mm

我想在顶部显示基于电子邮件的不同行。例如,在上述情况下,结果应为:

email      name address
abc@a.com  ab    us
xyz@x.com  bv    dc
efg@e.com  cd    mm
abc@a.com  de    fr
xyz@x.com  bv    dc
efg@e.com  cd    mm

我正在使用下面的查询,但它只会给我一个截然不同的结果,我需要所有排在顶部的行

select ROW_NUMBER() OVER(PARTITION BY email ORDER BY email DESC) AS RowNumber, email, name address where RowNumber = 1

1 个答案:

答案 0 :(得分:2)

简单的方法......只需在ORDER BY子句中使用ROW_NUMBER ......

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData;

CREATE TABLE #TestData (
    email VARCHAR(10) NOT NULL,
    [name] CHAR(2) NOT NULL,
    [address] CHAR(2) NOT NULL 
    );

INSERT #TestData (email, [name], [address]) VALUES
    ('abc@a.com', 'ab', 'us'),
    ('abc@a.com', 'de', 'fr'),
    ('xyz@x.com', 'bv', 'dc'),
    ('efg@e.com', 'cd', 'mm'),
    ('xyz@x.com', 'bv', 'dc'),
    ('efg@e.com', 'cd', 'mm');

SELECT
    *
FROM
    #TestData td
ORDER BY 
    ROW_NUMBER() OVER (PARTITION BY td.email ORDER BY td.[name]);