Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

Оконные функции для получения среза последних данных

$
0
0
Приветствую

Firebird 3.0

Пытаюсь разобраться, как получить срез последних по времени данных
есть таблица:
CREATE TABLE MESSAGES (
    UUID            SYS$UUID NOT NULL /* SYS$UUID = CHAR(16) */,
    ON_UUID         SYS$UUID /* SYS$UUID = CHAR(16) */,
    TICK            SYS$TIMETICK NOT NULL /* SYS$TIMETICK = BIGINT */,
    MSG_TIME        SYS$TIMESTAMP /* SYS$TIMESTAMP = TIMESTAMP */,
    MSG_LOCAL_TIME  COMPUTED BY (dateadd(hour, RDB$GET_CONTEXT('USER_SESSION', 'TIMEZONE'), MSG_TIME)),
    SITE            SYS$NAME NOT NULL /* SYS$NAME = VARCHAR(128) */,
    DEVICE          SYS$NAME NOT NULL /* SYS$NAME = VARCHAR(128) */,
    MSG_TYPE        SYS$NAME NOT NULL /* SYS$NAME = VARCHAR(128) */,
    MSG_KIND        SYS$NAME /* SYS$NAME = VARCHAR(128) */,
    JSON            SYS$JSON /* SYS$JSON = BLOB SUB_TYPE 1 SEGMENT SIZE 80 */
);

ALTER TABLE MESSAGES ADD CONSTRAINT MESSAGES PRIMARY KEY (UUID);
CREATE INDEX MESSAGES_TICK ON MESSAGES (TICK, DEVICE, MSG_TYPE, MSG_KIND);
CREATE INDEX MESSAGES_TIME ON MESSAGES (MSG_TIME, DEVICE, MSG_TYPE, MSG_KIND);
CREATE DESCENDING INDEX MESSAGES_TIME_DESC ON MESSAGES (MSG_TIME, DEVICE, MSG_TYPE, MSG_KIND);

набросал запрос который, вроде работает
with MDATA as (
  select UUID, DEVICE, MSG_TIME, MSG_TYPE, MSG_KIND, first_value(UUID) over (partition by DEVICE order by MSG_TIME desc) as OVER_UUID
  from MESSAGES
  where MSG_TIME between current_timestamp - 1 and current_timestamp
  order by DEVICE
)
select DEVICE, MSG_TIME, MSG_TYPE, MSG_KIND
from MDATA
where UUID = OVER_UUID

План: PLAN SORT (SORT (MD M INDEX (MESSAGES_TIME)))

Можно ли обойтись без with, и какие нужны индексы чтобы не вычитывать все записи за сутки?

Viewing all articles
Browse latest Browse all 1677

Trending Articles