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


Автор: Sanek81 31.8.2007, 22:17
Очень нужна помощь опытных программистов. Рассмотрим 3 поля из таблицы "Table". 
Первое поле - "ID" (счётчик), уникальное ключевое поле. Второе поле - "Код"(числовое), в котором допускаются повторения. Третье поле - "Дата" (дата/время), в нём тоже допускаются совпадения. В этой таблице каждому коду соответствует несколько различных дат. Мне просто кровь из носу необходимо отобрать все ID, соответствующие кодам с максимальными датами!

Делаю следующий запрос:

Код

SELECT ID, MAX(Дата)
FROM Table
GROUP BY Код;


И получаю ощибку, что нельзя включить в запрос поле ID , так как оно не является частью статистической функции Max, которую я использую чтобы отобрать максимальные даты, сгруппировав их по полю Код.  И как я только не пытался уже исхитриться, у меня ничего не выходит, а ведь каждая запись в таблице уникальна, и если выполнить данный запрос убрав из него ID, то он выдаёт результат, в виде набора записей, и по идее у каждой из этой записи свой уникальный ID, так вот у меня вопрос, как мне получить этот ID. Помогите пожалуйста!!! smile

Автор: comtat 31.8.2007, 22:36
Код

SELECT ID, Дата  FROM Table t1
INNER JOIN (SELECT MAX(Дата) AS DateTT, t2.Код  FROM Table t2 GROUP BY Код) as t2 on t2.Код = t1.Код and t2.DateTT = t1.Дата

Автор: Sanek81 31.8.2007, 23:22
Спасибо, работает нормально!!! Я только не совсем понял что это всё означает, и даже аксесс загнулся, когда я попытался в виде конструктора это изобразить smile. Сначала мне показалось, что он неправильно работает поскольку он вернул немного больше записей чем нужно, но потом понял, что это из-за того, что в некоторых кодах даты повторяются, а по идее не должны (ошибка оператора). Так что ещё раз спасибо, и всё-таки у меня ещё маленький вопросик - можно как-нибудь более коротко это реализовать, или ТОЛЬКО вот так?

Автор: Akina 1.9.2007, 00:31
Цитата(Sanek81 @  1.9.2007,  00:22 Найти цитируемый пост)
Я только не совсем понял что это всё означает


Все очень просто.

Сначала построй вот такой запрос:
Код

SELECT Table.Код, Max(Table.Дата) AS [Max-Дата]
FROM Table
GROUP BY Table.Код;

Дай ему имя, скажем, Query1.
Потом построй второй запрос:
Код

SELECT Table.ID, Table.Код, Table.Дата
FROM Query1 INNER JOIN [Table] ON (Query1.[Max-Дата] = Table.Дата) AND (Query1.Код = Table.Код);

Второй запрос дает то, что тебе нужно...

А теперь просто пойми, что сделал каждый из них, рассмотрев, что видно в построителе запросов.

Добавлено через 51 секунду
Цитата(Sanek81 @  1.9.2007,  00:22 Найти цитируемый пост)
маленький вопросик - можно как-нибудь более коротко это реализовать, или ТОЛЬКО вот так?

В рамках MS Access по-иному не получится.

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