Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите, пожалуйста, с группировкой в запросе  [new]
monSql
Member

Откуда:
Сообщений: 8
Здравствуйте. Проблема такая: существует таблица Visitors:
id firstname lastname middlename doctype docnum photoid requestid acceptorid

Нужно выбрать все записи из таблицы с уникальными именем/фамилией/отчеством, причём остальные поля можно взять любые (главное, чтобы они были из одной записи в таблице: например, взять первую запись, отсортированную по id). То есть нужна какая-то аггрегирующая функция, возвращающая верхнее отсортированное значение. Что-то типа такого:
SELECT MAX(id), firstname, lastname, middlename, SomeFN(doctype ORDER BY id desc), SomeFN(docnum ORDER BY id desc), .......
FROM Visitors
GROUP BY firstname, lastname, middlename

Или, может, создать временную таблицу
SELECT DISTINCT firstname, lastname, middlename FROM Visitors

и как-то использовать её в запросе? Подскажите, пожалуйста, варианты. Как вариант - сделать через курсор (запрос используется в хранимой процедуре), но, может, есть более оптимальное решение.
23 янв 12, 12:17    [11951035]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, с группировкой в запросе  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
with zz(id, firstname, lastname, middlename)
as
(
select MAX(id), firstname, lastname, middlename
from Visitors
GROUP BY firstname, lastname, middlename
)
select *
from zz
inner join Visitors v on v.id = z.id
23 янв 12, 12:36    [11951224]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, с группировкой в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SELECT TOP(1) WITH TIES *
FROM Visitors
ORDER BY ROW_NUMBER()OVER(PARTITION BY firstname,lastname,middlename ORDER BY id);
Только вот текстовые данные могут быть в разных регистрах,
русские буквы могут быть ошибочно заменены на похожие английские,
может быть различное количество пробельных символов и т.д. и т.п.
Очень корявая задача.
23 янв 12, 12:44    [11951286]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, с группировкой в запросе  [new]
monSql
Member

Откуда:
Сообщений: 8
Оба варианта рабочие, большое спасибо за помощь! Как раз то, что нужно. Возьму на заметку такие решения.
23 янв 12, 13:53    [11952080]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, с группировкой в запросе  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
monSql
Оба варианта рабочие, большое спасибо за помощь! Как раз то, что нужно. Возьму на заметку такие решения.

А что насчет скорости работы и плана выполнения?Может выложишь?
23 янв 12, 14:11    [11952267]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, с группировкой в запросе  [new]
monSql
Member

Откуда:
Сообщений: 8
denis2710,

Сорри за задержку, хотел проверить после внедрения на реальной базе. Скорость двух вариантов абсолютно одинаковая. Около 10000 записей, время выполнения 0.203-0.218 с.
24 янв 12, 10:50    [11958337]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста, с группировкой в запросе  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
monSql,

Понятно.С таким количеством записей разницы нет
24 янв 12, 12:01    [11958974]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить