2013-02-20 70 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