Как получить минимальную запись сегодняшнего дня (время) и максимальную запись предыдущего дня (время)

Использование базы данных MS Access

Я хочу отобразить минимум записи сегодняшнего дня (время) и максимум записи предыдущего дня (время)

Таблица

PERSON ID  CARDEVENTDATE  CARDEVENTTIME
5008       20090805       080000
5008       20090805       140000
5008       20090809       180000
5008       20090809       220000
5008       20090813       090000
5008       20090813       200000
5008       20090818       110000
5008       20090818       232200
3405       20090805       080000
3405       20090805       180000
3405       20090809       070000
3405       20090809       230000
3010       20080806       090000
3010       20080806       230000
3010       20080810       100000
3010       20080810       160000

и так далее...

Из приведенной выше таблицы я хочу отобразить сегодня мин. (Время) и макс. (Время) предыдущего дня.

Предыдущий день означает не вчера, а предыдущее событие автомобиля для данного идентификатора человека.

Использую подзапросы.

Я использую указанный ниже запрос.

"SELECT PERSONID, CARDEVENTDATE, MIN (CARDEVENTTIME) AS INTIME, 
    MAX (CARDEVENTTIME) AS OUTTIME FROM (SELECT T_PERSON.PERSONID, 
    T_CARDEVENT.CARDEVENTDATE, T_CARDEVENT.CARDEVENTTIME 
FROM (T_TITLE INNER JOIN T_PERSON ON T_TITLE.TITLECODE = T_PERSON.TITLECODE)
    INNER JOIN T_CARDEVENT ON T_PERSON.PERSONID = T_CARDEVENT.PERSONID 
WHERE T_CARDEVENT.CARDEVENTDATE BETWEEN '" & sdate & "' AND '" & edate & "' 
ORDER BY T_PERSON.TITLECODE) GROUP BY PERSONID, CARDEVENTDATE))"

Но я не могу получить максимум (время) предыдущего дня. Я хочу получить сегодня мин. (Время) и предыдущий день (время) для конкретного идентификатора человека.

Предыдущий день означает не вчера, а предыдущее событие автомобиля для данного идентификатора человека.

Ожидаемый результат.

PERSON ID  CARDEVENTDATE  MIN TIME  CARDEVENTDATE  MAX TIME
5008       20090818       110000    20090813       200000
5008       20090813       090000    20090809       220000
5008       20090809       180000    20090805       140000
3405       20090809       070000    20090805       180000
3010       20080810       100000    20080806       230000

и так далее...

Нужна помощь по запросу.


person Gopal    schedule 28.06.2009    source источник
comment
Спасибо, что сняли колпачки ...   -  person Wadih M.    schedule 28.06.2009
comment
Почему ваш вывод содержит три строки для 5008? Не думаю, что я достаточно понимаю вашу логику, чтобы дать вам ответ. Я бы подумал, что у него должна быть 1 строка на каждый идентификатор человека из вашего описания.   -  person David Walker    schedule 28.06.2009


Ответы (1)


Отбросьте последний ответ.

Допустим, вы сохранили свой запрос как DAYMINMAX.
Вам потребуется создать другой запрос:

SELECT a.PERSONID  
     , MAX(b.CARDEVENTDATE) AS PREVDAY  
     , a.CARDEVENTDATE AS NEWDAY  
    FROM DAYMINMAX AS a INNER JOIN  
         DAYMINMAX AS b ON a.PERSONID = b.PERSONID  
                       AND a.CARDEVENTDATE > b.CARDEVENTDATE  
    GROUP BY a.PERSONID, a.CARDEVENTDATE  

Этот запрос дает вам одну дату и ее предыдущую дату на человека. Назовем его DAYPREVNEW. Теперь вам понадобится еще один запрос (тот, который вам нужен):

SELECT a.PERSONID  
     , a.PREVDAY  
     , b.OUTTIME  
     , a.NEWDAY  
     , c.INTIME  
    FROM (DAYPREVNEW AS a INNER JOIN
         DAYMINMAX AS b ON a.PERSONID = b.PERSONID AND a.PREVDAY = b.CARDEVENTDATE) INNER JOIN DAYMINMAX AS c ON a.PERSONID = c.PERSONID AND a.NEWDAY = c.CARDEVENTDATE

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

person Wilhelm    schedule 28.06.2009
comment
@ Вильгельм. Отображение синтаксической ошибки в операторе соединения - Gopal - person Gopal; 28.06.2009
comment
Все еще не получил правильного ответа - person Gopal; 28.06.2009