Вопросы | ms-access

Шаблон проектирования MS-Access для последнего значения для группировки

Вопрос

Knox | 2784 просмотров | рейтинг: 1

Распространено иметь таблицу, где, например, поля являются счетом, значением и временем. Каков наилучший шаблон для получения последнего значения для каждой учетной записи? К сожалению, последнее ключевое слово в группе дает вам последнюю физическую запись в базе данных, а не последнюю запись какой-либо сортировки. Что означает ИМХО, это никогда не должно использоваться. Я использую два неуклюжих подхода: подход подзапроса или вторичный запрос для определения последней записи, а затем присоединение к таблице для поиска значения. Разве нет более элегантного подхода?



Ответы

Dhaust

+ 1 -
Опция подзапроса звучит лучше для меня, что-то вроде следующего psuedo-sql. Может быть возможно / необходимо оптимизировать его с помощью объединения, что будет зависеть от возможностей механизма SQL.
 select *
from table
where account+time in (select account+max(time)
                       from table
                       group by account
                       order by time)
 

 


shsteimer

+ 1 -
не могли бы вы сделать:
 select account,last(value),max(time)
from table
group by account
 

Я проверил это (предоставлено для очень небольшого, почти тривиального набора записей), и оно дало надлежащие результаты. Редактировать: это также не работает после еще нескольких испытаний. В прошлой жизни я довольно много занимался программированием доступа и чувствую, что есть способ сделать то, что вы просите, в 1 запросе, но в данный момент я рисую пробел. извиняюсь.  


Tom

+ 1 -
Это хороший трюк для возврата последней записи в таблице:
 SELECT TOP 1 * FROM TableName ORDER BY Time DESC
 

Проверьте этот сайт для получения дополнительной информации.  


Knox

+ 0 -
@shs да, этот select last (значение) ДОЛЖЕН работать, но это не так ... Мое понимание, хотя я не могу создать источник авторизации, заключается в том, что last (значение) дает последнюю физическую запись в файле доступа, что означает, что может быть первым по времени, но последним физически. Поэтому я не думаю, что вы должны использовать last (значение) для чего-либо, кроме действительно плохой случайной строки.  


pghcpa

+ 1 -
@ Tom В целом мне может быть проще выполнить предложенный вами запрос In. Вообще я делаю что-то вроде
 select T1.account, T1.value
from table T as T1
where T1 = (select max(T2.time) from table T as T2 where T1.account = T2.Account)
 

 


Anonymous

+ 0 -
Возможно, следующий SQL-код неуклюж, но в Access он работает правильно.
 SELECT
    a.account,
    a.time,
    a.value
FROM
    tablename AS a INNER JOIN [
        SELECT
            account,
            Max(time) AS MaxOftime
        FROM
            tablename
    GROUP BY
        account
    ]. AS b
    ON
        (a.time = b.MaxOftime)
        AND (a.account = b.account)
;
 

 


Anonymous

+ 0 -
Я пытаюсь найти последнюю дату в группе с помощью построителя запросов Access 2003 и столкнулся с той же проблемой, пытаясь использовать LAST для поля даты. Но похоже, что использование MAX находит последнюю дату.  


Anonymous

+ 1 -
После буквально лет поиска я наконец нашел ответ по ссылке ниже # 3. Подзапросы выше будут работать, но очень медленные - изнурительно медленные для моих целей. Наиболее популярным ответом является трехуровневый запрос: 1-й уровень находит максимум, 2-й уровень получает значения поля на основе 1-го запроса. Затем результат объединяется в виде таблицы с основным запросом. Быстрый, но сложный и трудоемкий код / поддержка. Эта ссылка работает, все еще работает довольно быстро и требует гораздо меньше усилий для написания кода. Спасибо авторам этого сайта. http://access.mvps.org/access/queries/qry0020.htm


Теги

ms-access