Помогите составить запрос

Mari.P
Дата: 04.12.2018 14:04:47
Дано: скада система, СУБД внутренняя нестандартная, есть доступ по ODBC, в ней таблицы.
CDBPOINT - описание параметров
CDBHISTORIC - ретроспектива

CDBPOINT.id -id параметра
CDBPOINT.Fullname - имя параметра

CDBHISTORIC.id -id параметра, где CDBPOINT.id=CDBHISTORIC.id
CDBHISTORIC.time - время параметра
CDBHISTORIC.value - значение параметра

Задача: составить запрос, где из таблицы CDBHISTORIC брать параметры со всеми возможными id за определенный период, но каждый параметр должен быть представлен один раз с наиболее "свежей" датой из периода.
SELECT TOP (1500) CDBHISTORIC.value,CDBPOINT.Fullname,CDBHISTORIC.RecordTime AS '~Time' 
       FROM CDBHISTORIC,CDBPOINT 
       WHERE CDBHISTORIC.id=CDBPOINT.id 
                          AND ('~Time'>TIMESTAMP '2018-12-03 01:00:00') AND  ('~Time'<TIMESTAMP '2018-12-03 01:00:30')


Здесь она мне все выводит за 30 сек, даже если по одному параметру было скажем 10 точек, а мне надо только одну по каждому параметру, самую близкую к концу периода. Знаю, что надо использовать MAX и GROUP BY, но почему-то ошибки получаются.
alex55555
Дата: 04.12.2018 14:35:59
Mari.P
Знаю, что надо использовать MAX и GROUP BY, но почему-то ошибки получаются.

Знаю, что не умею, но почему мне денег никто не даёт? Ну почему?

Девушка, вы зачем изложили много текста, и при этом не сообщили, какой запрос даёт ошибки? И какие ошибки? Или вы опять где-то слышали, что здесь живут телепаты?

А что бы вам готовый запрос кто-то дал, нужно знать, что там у вас за база, ибо синтаксис у неё нестандартный.
Mari.P
Дата: 04.12.2018 14:41:06
SCADA система ClearSCADA 2015 R2, СУБД у нее внутренняя, сильно похожа на обычные бинарные файлы, но драйвер ODBC есть, и c SQL запросам работать можно. Насчет денег - это вы зря, я линейный инженер и мне надо сделать выборку для оценки режима сети, если не составлю запрос - придется руками тащить по одному параметру.
Akina
Дата: 04.12.2018 14:43:53
Mari.P
каждый параметр должен быть представлен один раз с наиболее "свежей" датой из периода.
А что делать, если имеется две записи с одинаковым "самым свежим" штампом времени? и не надо лепетать, что "такого не может быть", а в ууникальный индекс я не верю.

Mari.P
в ней таблицы
Показывайте DDL таблиц, а не "сочинение по мотивам".

Mari.P
Знаю, что надо использовать MAX и GROUP BY
Ещё забыли слово "подзапрос". А заодно сказать, а поддерживает ли эта самая нестандартная СУБД подзапросы... а заодно, чтобы два раза не бегать, и CTE.
Dima T
Дата: 04.12.2018 14:56:58
Mari.P
за 30 сек

Для ускорения надо индексы по ID для CDBPOINT и по (ID,RecordTime) для CDBHISTORIC
Mari.P
Дата: 04.12.2018 15:18:36
Akina
Показывайте DDL таблиц, а не "сочинение по мотивам".

Прошу прощения, а что такое DDL и как его показать?
Dima T
Дата: 04.12.2018 15:56:04
Если подзапросы понимает, то так
SELECT TOP (1500) CDBHISTORIC.value,CDBPOINT.Fullname,CDBHISTORIC.RecordTime AS '~Time' 
       FROM CDBPOINT, CDBHISTORIC, (select CDBHISTORIC.id, max(CDBHISTORIC.RecordTime) as RecordTime 
                                       from CDBHISTORIC 
                                       where (CDBHISTORIC.RecordTime>TIMESTAMP '2018-12-03 01:00:00') 
                                            AND  (CDBHISTORIC.RecordTime<TIMESTAMP '2018-12-03 01:00:30')
                                       group by CDBHISTORIC.id
                                   ) CHMAX
       WHERE CDBHISTORIC.id=CDBPOINT.id 
                   AND CDBHISTORIC.id=CHMAX.id and CDBHISTORIC.RecordTime = CHMAX.RecordTime


Как уже выше подмечено - может быть задвоение, если в CDBHISTORIC для одного и того же ID несколько записей с одинаковым максимальным временем в RecordTime.
exp98
Дата: 04.12.2018 18:15:07
Mari.P, я тоже не знаток скады, просто сомнение:
SELECT TOP (1500) .... без ORDER BY оно точно возьмёт в нужном порядке?
alex55555
Дата: 05.12.2018 15:29:51
Mari.P
Насчет денег - это вы зря, я линейный инженер и мне надо сделать выборку для оценки режима сети, если не составлю запрос - придется руками тащить по одному параметру.

Это была попытка показать по аналогии, что "почему-то не получается" есть как минимум очень малоинформативное пояснение.

Вы знаете, что такое вложенные запросы? Вы сумеете понять суть примера, приведённого выше участником Dima T? Эти вопросы возникают в следствии ваших "простых" пояснений, потому что очень похоже, что вам помимо примера запроса ещё много чего нужно разжевать.
Mari.P
Дата: 06.12.2018 10:09:24
Спасибо вам огромное!
По синтаксису только так прошло, но выдает QueryTimeOut, зациклился может быть где-то?
SELECT TOP (10000) CDBHISTORIC.ValueAsReal,CDBPOINT.FullName,CDBHISTORIC.RecordTime
  FROM CDBHISTORIC,CDBPOINT,(SELECT CDBHISTORIC.ID,MAX(CDBHISTORIC.RecordTime)  AS "~RecTime" 
FROM CDBHISTORIC,CDBPOINT WHERE CDBHISTORIC.ID=CDBPOINT.ID 
AND CDBHISTORIC.RecordTime>TIMESTAMP '2018-12-03 01:00:00'  
AND CDBHISTORIC.RecordTime<TIMESTAMP '2018-12-03 01:00:10'  GROUP BY CDBHISTORIC.ID)CHMAX 
WHERE CDBHISTORIC.ID=CDBPOINT.ID AND  CDBHISTORIC.ID=CHMAX.ID AND CDBHISTORIC.RecordTime="~RecTime"