|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
функция МАХ для выбора значений
Здравствуйте!!!
Вопрос по DELPHI Подскажите кто может, никак не могу понять что сделать в такой ситуации... Есть две таблицы. 1. Основная - Osnova имеет поля ID*, f1,f2,f3... 2. Подчиненная - Status имеет поля ID*, status, datastatus, IDosnova где Оsnova.ID=Status.IDosnova Для каждого Оsnova.ID может быть несколько статусов с разными датами. Приблизительно вот так: Status ID*, status, datastatus, IDosnova 76 передано 27.06.2011 134 77 сдано 13.05.2011 134 78 возврат 14.09.2010 135 79 сдано 15.07.2011 135 Необходимо сделать такую выборку что бы остались для каждого IDosnova только последние по дате значения.т.е. ID*, status, datastatus, IDosnova 76 передано 27.06.2011 134 79 сдано 15.07.2011 135 Это я сделал вот так (но только для двух полей datastatus, IDosnova): select status.IDosnova, max(status.Datastatus) from status group by status.IDosnova Но кроме status.IDosnova, status.datastatus надо еще выбрать несколько полей, например status.status, как это сделать?!?!?!? Так если добавить поле оно выдаст все значения... |
#2
|
|||
|
|||
Выноси эти поля в GROUP BY
|
#3
|
|||
|
|||
нет, так не получается.
|
#4
|
||||
|
||||
А так не пойдёт?
Код:
select * {или список полей} from status where status.Datastatus=max(status.Datastatus) group by status.IDosnova - Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА! |
#5
|
|||
|
|||
а так выдает ошибку capability not supported
|
#6
|
||||
|
||||
В Accesse такое вроде должно проходить. Если не поддерживает SQL, a программа на Delphi, то можно сначало найти max(status.Datastatus)
одним запросом а потом программно найденную дату подсунуть в предложение where (можно в качестве параметра) в следующий запрос. - Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА! Последний раз редактировалось Viajero, 08.08.2011 в 17:43. |
#7
|
|||
|
|||
пишу на delpphi 7 база через BDE
|
#8
|
||||
|
||||
Ну я ж вроде объяснил
Код:
select max(status.Datastatus) from status Код:
select * {или список полей} from status where status.Datastatus= //здесь ставим конкретную дату например dtMaxDatastatus group by status.IDosnova - Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА! |
#9
|
|||
|
|||
У меня была аналогичная задача.
Был журнал учета приборов и подчиненный журнал техсостояния, куда записывались результаты периодических проверок-те хранилась вся история прибора. Текущее состояние прибора-это последняя запись в журнале техсостояний Я ее решил при помощи подзапроса. Код:
SELECT * FROM Osnova Os1, Status S1 WHERE (Os1.ID=S1.IDOsnova) AND (S1.Dat=(SELECT MAX(Dat) FROM Status S2 WHERE (Os1.ID=S2.IDosnova))) Суть вот в чем. Строка (Os1.ID=S1.IDOsnova) связывает основныу и подчиненную табл. по ключевому полю. Выполняется внутренний подзапрос и его результат используется для работы основного запроса. S1,S2 и Os1- это псевдонимы таблиц. Обрати внимание что в подзапросе используется другой псевдоним (S2). Это нужно чтобы подзапрос мог свободно скроллировать по таблице. Еще замечание Индексы по дате нужны обязательно, иначе все это будет работать ОЧЕНЬ медленно Пишу по памяти. Если где-то соврал-извини |
#10
|
|||
|
|||
еще замечание
ты должен гарантировать что для данного Status.IDosnova даты не повторяются, иначе результат будет непредсказуемым. Для этого проще всего в дату включить и время (например системное) Последний раз редактировалось chainik, 13.08.2011 в 10:45. |
#11
|
||||
|
||||
Цитата:
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА! |