2013-02-20 4 views
0

У меня есть таблицаВыберите отчетливый порядок записей по п

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') 

Теперь мне нужно выбрать все разное имя по шкале и иметь минимальный идентификационный номер. Результат должен быть

1, Ram 
6, ram 
7, RAM 

ответ

0

Вы можете использовать это: что я добавил «СОРТ- 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

Получили решение ... Спасибо Иван G :) –

+1

мне было интересно, почему вы должны использовать общее табличное выражение с некоторой аналитической функцией, когда это можно просто сделать, используя простой запрос, используя условия «MIN» и «GROUP BY». –

+0

@JW В этом случае подзапрос не является проблемой производительности, этот подход даже имеет немного меньшую стоимость в плане выполнения, а затем подход «GROUP BY». Если вы спросите меня, оба подхода одинаково читаемы. –

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' в наборе результатов по некоторым причинам –

+0

@AndreyGordeev вы можете просто добавить это в условие' WHERE' 'WHERE name <> 'ra'' –

Смежные вопросы