<<На Главную     <В меню Советы по MSSQL

 

Рассмотрим решение такой иногда встречающейся задачи - необходимо извлечь (локализовать) из таблицы БД MS SQL Server  с повторяющимися ключами записи с максимальным значением в одном из неключевых полей.

 

 

 

Предположим, что в качестве примера мы располагаем такой нехитрой таблицей :

 

 

 Обратите внимание, что записи по ключевым полям p1, p2 и p3 в  учебной таблице являются повторяющимися, но имеются записи и с уникальным сочетанием по этим ключам. В качестве параметров p1, p2 и p3 нашей модельной таблицы могут быть например, фамилия, имя, отчество клиента банка, полем d1- дата открытия счета, а полем id - скажем, номер договора. В общем, ситуация достаточно распространенная ... Если проецировать наш случай на предложенный 'банковский' пример , то задача может оказаться совсем конкретной и понятной - необходимо узнать номер последнего по времени договора , выбрав всех клиентов банка. Из приведенной аналогии нетрудно понять, что у каждого клиента может быть один или несколько, ну скажем, кредитных договоров. Где-то так :

 

 

Однако, как говориться, вернемся к нашим баранам ...

Казалось бы, что простейшее решение связано с использованием функции MAX (), но оно приводит к ошибке в запросе:

 

  

 

 

Попробуем следующий запрос - но уже  с использованием предложения GROUP BY:

 

Запрос Group BY

 

Вроде бы получили нужную выборку, но в таком запросе не удалось выяснить значение поля id (в случае нашего примера). А именно его (локализацию записи) и хотелось бы определить.

 

Попытка дополнить  запрос полем id приводит к ошибке:

 

 

Решение нашей задачки заключается в выборке из двух запросов

 

Select t.id, t.p1, t.p2, t.p3, s.d1Max From table1 t ,

(select p1, p2, p3, MAX(d1) d1Max From Table1

Group by p1, p2, p3) s

Where (t.p1 = s.p1 and t.p2=s.p2 and t.p3 = s.p3 and t.d1 = s.d1Max)

Order by t.id

 

 и может выглядеть сл. образом:

 

Sql-запрос

 

Вот теперь все нормально - узнали идентификатор каждой записи по полю id.  Вполне понятно, что предложенный запрос можно настроить и для выборки записей с любыми другими статистическими критериями.

 

 

Тот же подход, но для случая приведенного выше  'банковского примера' запрос и результат будет, пожалуй, даже более наглядным

:

 

Simashkov.2016

16.01.2016 г.

Назад