powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите записать условие запроса
12 сообщений из 12, страница 1 из 1
Помогите записать условие запроса
    #39285382
Роман Янковский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую,

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

select e.created_utc, i.* from station_history_entry e
join
(select distinct station_id from station_history_item) s
on
1=1
join
station_history_item i
on
i.station_id = s.station_id
and
i.entry_id in (select max(entry_id) from station_history_item i2 where i2.station_id=i.station_id and i2.entry_id <= e.id)
order by
e.created_utc


В общем, есть две таблицы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
STATION_HISTORY_ENTRY
ID            TIMESTAMP
1              07.06.2016 10:00
2              07.06.2016 10:10

STATION_HISTORY_ITEM
ID            ENTRY_ID    STATION_ID  LOCKS       SLOTS      TIMESTAMP
1              1              1         5           5          07.06.2016 10:00
2              1              2         0           5          07.06.2016 10:00
3              2              1         4           6          07.06.2016 10:10
<---- вторая запись для STATION_ID=2 отсутствует

В результате хочется получить вот такую выборку

Код: plaintext
1.
2.
3.
4.
STATION_ID        LOCKS       SLOTS         TIMESTAMP
    1               5           5          07.06.2016 10:00
    1               4           6          07.06.2016 10:10
    2               0           5          07.06.2016 10:00
    2               0           5          07.06.2016 10:10 <--- взято значение предыдущей записи

То есть если значения нет, должно браться значение за ближайшую предыдущую дату. Предполагаю, что задача достаточно часто встречающаяся. Явно я что-то очень простое упускаю.
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285388
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман ЯнковскийПредполагаю, что задача достаточно часто встречающаяся.

Задача совсем не частая и решается
а) Отдельными запросами;
б) PSQL блоком;
в) Аналитическими функциями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285397
Роман Янковский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Понятно... А можешь наводку на подходящие аналитические функции дать? Как раз недавно мигрировали на fb3.0, может там есть что-то нужное, о чем я не знаю.
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285406
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман Янковский,

LEAD/LAG
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285413
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисLEAD/LAG
Скорее FIRST_VALUE, но я не уверен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285421
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у мну такое впечатление ,что не хватает отдельной таблицы-справочника по правильным TIMESTAMP

иначе "07.06.2016 10:10 <--- взято значение предыдущей записи" - а с какого это потолка мы взяли TIMESTAMP для НЕСУЩЕСТВУЮЩЕЙ записи ???
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285444
Роман Янковский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochиначе "07.06.2016 10:10 <--- взято значение предыдущей записи" - а с какого это потолка мы взяли TIMESTAMP для НЕСУЩЕСТВУЮЩЕЙ записи ???

Из таблицы STATION_HISTORY_ENTRY
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285499
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что и в каком количестве там есть вообще ?
а если туда добавить ещё третью строку "2 07.06.2016 10:35" ?
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285504
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. на мой вкус логика отчёта примерно такая

1. мы получаем справочник (или последовательность созданную в SP ) канонических TimeStamp
2. для каждого TS пребираем все Station_ID
3. для каждого {TS;S_ID} вытягиваем First(1) .... where TS <= :TS and S_ID = :S_ID

при этом ещё может быть ситуация когад дял какй=то станций записей нет ну вот вообще...
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285511
Роман Янковский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа что и в каком количестве там есть вообще ?

Порядка 100 тыс записей в _ENTRY и порядка 2 млн записей в _ITEM на текущий момент.

Ariochа если туда добавить ещё третью строку "2 07.06.2016 10:35" ?

Не понял :)
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285512
Роман Янковский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochпри этом ещё может быть ситуация когад дял какй=то станций записей нет ну вот вообще...

Можем игнорировать такие станции
...
Рейтинг: 0 / 0
Помогите записать условие запроса
    #39285534
Роман Янковский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LAG или FIRST_VALUE вроде похожи на то, что нужно. Попробую разобраться с ними. Спасибо за наводку.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите записать условие запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]