2013-02-20 67 views
0

选择不重复的记录顺序我有一个表by子句

Table1 
(
    id bigint 
    , name nvarchar(50) 
) 

这个表可以有不同的情况下,名称相同的名称。

Insert into Table1 
(Select 1, 'Ram') 
(Select 2, 'Ram') 
(Select 3, 'Ram') 
(Select 4, 'Ram') 
(Select 5, 'ra') 
(Select 6, 'ram') 
(Select 7, 'RAM') 
(Select 8, 'RAM') 

现在我需要按大小写选择所有不同的名称并且使用最小的id号。结果应该是

1, Ram 
6, ram 
7, RAM 

回答

0

您可以使用此:我添加了“COLLATE Latin1_General_CS_AI”

SELECT t.id 
     , t.name 
FROM (
     SELECT ROW_NUMBER() OVER (PARTITION BY name COLLATE Latin1_General_CS_AI ORDER BY id) num 
       ,* 
     FROM Table1 
) t 
WHERE num = 1 AND name = 'ram' 
ORDER BY t.id 

通知 - 这告诉SQL Server执行什么类型的字符串比较的,如果你的数据库归类区分大小写(CS)可以删除这部分查询,但如果您的归类不区分大小写(CI),则必须使用归类的区分大小写的版本(我使用区分大小写,区分变音不敏感的Latin1_General)。

+0

得到了解决...谢谢伊万摹:) – 2013-02-20 07:23:50

+1

我想知道为什么你需要使用公用表表达式当使用'MIN'和'GROUP BY'子句进行简单的查询时可以简单地完成这些操作。 – 2013-02-20 07:24:34

+0

@JW在这种情况下,子查询不是一个性能问题,这种方法在执行计划中甚至比“GROUP BY”方法的成本略低。如果你问我,两种方法都具有相同的可读性。 – 2013-02-20 07:30:50

5
SELECT MIN(ID) ID, name COLLATE Latin1_General_CS_AS Name 
FROM table1 
WHERE name <> 'ra' 
GROUP BY name COLLATE Latin1_General_CS_AS 
ORDER BY ID 
+1

是的,但由于某些原因,OP不希望在结果集中包含'ra' – 2013-02-20 07:16:10

+0

@AndreyGordeev,你可以简单地在WHERE名称中添加这个名称。 – 2013-02-20 07:17:56

0
select min(id),name from Table1group by UPPER(name) ASC