Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Возможно ли исключить дубли в запросе?


Автор: ilta 1.11.2013, 11:54
Здравствуйте!
Есть база на MS SQL Server. Есть запрос вида select * from table where conditions, выводит он информацию следующего вида:
ФИО, ДАТА ПОСЕЩЕНИЯ, КОЛИЧЕСТВО, ПУНКТ НАЗНАЧЕНИЯ
'Иванов Иван Иванович', '10.10.2013', 345, 'Москва'
'Иванов Иван Иванович', '01.11.2013', 123, 'Питер'
'Петров Петр Петрович', '31.10.2013', 234, 'Воркута'
'Петров Петр Петрович', '15.10.2013', 123, 'Вологда'
'Семенов Семен Семенович', '25.10.2013', 333, 'Ставрополь'.
Вопрос следующий - возможно ли в принципе в запросе выбрать записи так, чтобы кроме общих условий для выборки этих строк были еще условия для каждого человека. Не знаю, как понятнее объяснить, покажу на примерах.
Пример 1:
Для каждого человека выбрать запись с большей датой, т.е. чтобы запрос выдавал:
'Иванов Иван Иванович', '01.11.2013', 123, 'Питер'
'Петров Петр Петрович', '31.10.2013', 234, 'Воркута'
'Семенов Семен Семенович', '25.10.2013', 333, 'Ставрополь'
Пример 2:
Для каждого человека выбрать запись с каким-то определенным числом, т.е. чтобы запрос выдавал:
'Иванов Иван Иванович', '01.11.2013', 123, 'Питер'
'Петров Петр Петрович', '15.10.2013', 123, 'Вологда'
'Семенов Семен Семенович', '25.10.2013', 333, 'Ставрополь'
Пример 3:
Есть список приоритетных городов(Москва, Воркута), для каждого человека выбрать запись с приоритетным городом:
'Иванов Иван Иванович', '10.10.2013', 345, 'Москва'
'Петров Петр Петрович', '31.10.2013', 234, 'Воркута'
'Семенов Семен Семенович', '25.10.2013', 333, 'Ставрополь'

Возможно ли это и, если возможно, то какая конструкция для этого используется? Если можно, пример, но и без примера буду благодарна, хоть бы знать в какую сторону смотреть.
Заранее всем спасибо за внимание! smile 

Автор: Akina 1.11.2013, 12:00
Всё это возможно.

Цитата(ilta @  1.11.2013,  12:54 Найти цитируемый пост)
Для каждого человека выбрать запись с большей датой

GROUP BY + MAX()

Цитата(ilta @  1.11.2013,  12:54 Найти цитируемый пост)
Для каждого человека выбрать запись с каким-то определенным числом

WHERE

Цитата(ilta @  1.11.2013,  12:54 Найти цитируемый пост)
выбрать запись с приоритетным городом

А это уже оконные функции, не факт, что твоя версия сервера их поддерживает. Возможно, придётся обходиться бабкиными методами.

Автор: ilta 1.11.2013, 13:23
Akina, спасибо за ответ!

Цитата(Akina @ 1.11.2013,  12:00)
Всё это возможно.

А одновременно? Например, если города разных приоритетов, то выбираем по городу, если нет приоритетного города, то выбираем по дате?

Цитата(Akina @ 1.11.2013,  12:00)
А это уже оконные функции, не факт, что твоя версия сервера их поддерживает. Возможно, придётся обходиться бабкиными методами.

Можно подробнее про оконные функции и про бабкины методы? Сервер MS SQL Server 2008R2

Автор: Akina 1.11.2013, 13:45
Цитата(ilta @  1.11.2013,  14:23 Найти цитируемый пост)
MS SQL Server 2008R2

ну тогда никаких проблем... http://technet.microsoft.com/ru-ru/library/ms186734(v=sql.105).aspx

Добавлено через 1 минуту и 21 секунду
Цитата(ilta @  1.11.2013,  14:23 Найти цитируемый пост)
А одновременно? Например, если города разных приоритетов, то выбираем по городу, если нет приоритетного города, то выбираем по дате?

Это называется "выбираем по город+дата".

Автор: ilta 5.11.2013, 11:49
Akina, спасибо большое! Сортировка по дате у меня получилась, а по городу не соображу как((( Есть ли возможность указать два приоритетных города?

Автор: ilta 7.11.2013, 09:06
Akina, спасибо большое еще раз! smile 
Отсортировала по городу с помощью http://technet.microsoft.com/ru-ru/library/ms181765(v=sql.105).aspx.

Автор: Akina 7.11.2013, 09:12
Цитата(ilta @  7.11.2013,  10:06 Найти цитируемый пост)
Отсортировала по городу с помощью case. 

 smile 
А почему не просто сортировка по двум полям? 
Код

Order By tourists.date, towns.priority
?

Автор: ilta 7.11.2013, 09:51
Неправильно выразилась. С помощью case определила towns.priority, отсортировала, конечно, через order by.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)