Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2015, 19:19   #1
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию Получение идентификатора самого "позднего" документа

Доброго времени суток!
У меня возник затык с написанием небольшого (?) SQL-запроса, что-то ничего на ум полезного не приходит

Имеется бд в Postgres 9.2, в которой находится таблица "documents", с полями Id (bigint), PersonId (bigint), DateOfIssue (date)

Из этой таблицы нужно получить идентификаторы (Id) документов по каждому человеку (PersonId), у которых дата выдачи документа (DateOfIssue) максимальна.
По каждому человеку нужно получить строго один идентификатор.
Если у человека может несколько документов с одинаковой датой выдачи, то выбрать следует наибольший Id

Моих крохотных знаний в SQL хватило только на то, чтобы получить дату самого "свежего" документа, но по ней много не наработаешь
Код:
SELECT MAX(DateOfIssue) FROM documents GROUP BY PersonId
Есть у кого соображения на этот счет?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 31.07.2015, 19:34   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

так попробуй
Код:
select u.PersonId,max(d.id) as Id
  from documents d,(SELECT PersonId,MAX(DateOfIssue) as MaxDateOfIssue FROM documents GROUP BY PersonId) u
  where d.PersonId=u.PersonId and d.DateOfIssue=u.MaxDateOfIssue
  group by u.PersonId
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.07.2015, 19:46   #3
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Спасибо, в точку
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 31.07.2015, 19:56   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Из этой таблицы нужно получить идентификаторы (Id) документов по каждому человеку (PersonId), у которых дата выдачи документа (DateOfIssue) максимальна.
По каждому человеку нужно получить строго один идентификатор.
Если у человека может несколько документов с одинаковой датой выдачи, то выбрать следует наибольший Id
Это задача для аналитической функции. Примерно так:
Код:
select
  PersonId, max(d.id) over (partition by PersonId order by DateOfIssue desc) MaxDocId
from
  documents
group by 
  PersonId;
В общем случае использование аналитической функции является предпочтительным, чем подзапрос с group by.
Vapaamies вне форума Ответить с цитированием
Старый 31.07.2015, 20:06   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Код:
... max(d.id) ...
Вот тут бд ругается на "d". Говорит, что не понимает что это за идентификатор
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 31.07.2015, 20:21   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Просто max(id)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.07.2015, 20:25   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Я код вслепую пишу, без сервера, так что могут быть нестыковки.

Еще можно с having попробовать, вообще просто будет:
Код:
select
  PersonId, max(Id) MaxDocId
from
  documents
group by 
  PersonId
having
  DateOfIssue = max(DateOfIssue);
Если этот вариант сработает, он даже предпочтительней аналитической функции, поскольку тут одна группировка, а в аналитическом -- одна явная и одна скрытая.
Vapaamies вне форума Ответить с цитированием
Старый 31.07.2015, 20:31   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Просто max(id) тоже нельзя,

Цитата:
ОШИБКА: колонка "documents.id" должна фигурировать в предложении GROUP BY или использоваться в агрегатной функции
having DateOfIssue = max(DateOfIssue); натыкается на то же самое, увы
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 31.07.2015, 21:05   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Так на MS SQL 12 прокатило. С group by беда
Код:
select DISTINCT
  PersonId, max(id) over (partition by PersonId order by DateOfIssue desc) MaxDocId
from
  documents
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.07.2015, 21:11   #10
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Так на MS SQL 12 прокатило.
Тогда запрос с аналитической функцией можно использовать для связи с другими таблицами. Скажем, если брать PersonId из таблицы Persons, где Id уникален, distinct делать не придется.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Заполнение "шапки" документа в xls через Access sahtheey Microsoft Office Access 7 05.10.2009 13:00
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04