Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.08.2011, 23:55
ximera370 ximera370 вне форума
Прохожий
 
Регистрация: 07.08.2011
Сообщения: 7
Репутация: 10
Восклицание функция МАХ для выбора значений

Здравствуйте!!!
Вопрос по 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  
Старый 08.08.2011, 02:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Выноси эти поля в GROUP BY
Ответить с цитированием
  #3  
Старый 08.08.2011, 16:37
ximera370 ximera370 вне форума
Прохожий
 
Регистрация: 07.08.2011
Сообщения: 7
Репутация: 10
По умолчанию

нет, так не получается.
Ответить с цитированием
  #4  
Старый 08.08.2011, 16:39
Аватар для Viajero
Viajero Viajero вне форума
Активный
 
Регистрация: 14.06.2011
Адрес: РБ
Сообщения: 214
Версия Delphi: Delphi 7 FB 2.5
Репутация: 5849
По умолчанию

А так не пойдёт?
Код:
select * {или список полей}
from status
where status.Datastatus=max(status.Datastatus)
group by status.IDosnova
__________________
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА!
Ответить с цитированием
  #5  
Старый 08.08.2011, 17:24
ximera370 ximera370 вне форума
Прохожий
 
Регистрация: 07.08.2011
Сообщения: 7
Репутация: 10
Счастье

а так выдает ошибку capability not supported
Ответить с цитированием
  #6  
Старый 08.08.2011, 17:41
Аватар для Viajero
Viajero Viajero вне форума
Активный
 
Регистрация: 14.06.2011
Адрес: РБ
Сообщения: 214
Версия Delphi: Delphi 7 FB 2.5
Репутация: 5849
По умолчанию

В Accesse такое вроде должно проходить. Если не поддерживает SQL, a программа на Delphi, то можно сначало найти max(status.Datastatus)
одним запросом а потом программно найденную дату подсунуть в предложение where (можно в качестве параметра) в следующий запрос.
__________________
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА!

Последний раз редактировалось Viajero, 08.08.2011 в 17:43.
Ответить с цитированием
  #7  
Старый 08.08.2011, 23:53
ximera370 ximera370 вне форума
Прохожий
 
Регистрация: 07.08.2011
Сообщения: 7
Репутация: 10
По умолчанию

пишу на delpphi 7 база через BDE
Ответить с цитированием
  #8  
Старый 09.08.2011, 09:58
Аватар для Viajero
Viajero Viajero вне форума
Активный
 
Регистрация: 14.06.2011
Адрес: РБ
Сообщения: 214
Версия Delphi: Delphi 7 FB 2.5
Репутация: 5849
По умолчанию

Ну я ж вроде объяснил
Код:
select max(status.Datastatus)
from status
средствами Delphi записываем max(status.Datastatus) в переменную, например dtMaxDatastatus

Код:
select * {или список полей}
from status
where status.Datastatus= //здесь ставим конкретную дату например dtMaxDatastatus
group by status.IDosnova
__________________
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА!
Ответить с цитированием
  #9  
Старый 13.08.2011, 10:29
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

У меня была аналогичная задача.
Был журнал учета приборов и подчиненный журнал техсостояния, куда записывались результаты периодических проверок-те хранилась вся история прибора. Текущее состояние прибора-это последняя запись в журнале техсостояний

Я ее решил при помощи подзапроса.

Код:
 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  
Старый 13.08.2011, 10:40
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

еще замечание
ты должен гарантировать что для данного Status.IDosnova даты не повторяются, иначе результат будет непредсказуемым.
Для этого проще всего в дату включить и время (например системное)

Последний раз редактировалось chainik, 13.08.2011 в 10:45.
Ответить с цитированием
  #11  
Старый 15.08.2011, 18:36
Аватар для Viajero
Viajero Viajero вне форума
Активный
 
Регистрация: 14.06.2011
Адрес: РБ
Сообщения: 214
Версия Delphi: Delphi 7 FB 2.5
Репутация: 5849
По умолчанию

Цитата:
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)))
Ну это если SQL сервер поддерживает. К сожалению TC не указал, что он использует.
__________________
- Товарищ прапорщик!!! Остановите поезд!!! - Поезд СТОЙ! РАЗ! ДВА!
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter