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

Код: sql
1.
2.
3.
4.
5.
SELECT D0.LINK_ID, D0.DATEOF, SUM(...), ...
FROM SOMETABLE D0
  LEFT JOIN SOMETABLE D1 ON D1.LINK_ID = D0.LINK_ID AND D1.DATEOF = D0.DATEOF + 1
  LEFT JOIN SOMETABLE D2 ON D2.LINK_ID = D0.LINK_ID AND D2.DATEOF = D0.DATEOF + 2
GROUP BY D0.LINK_ID, D0.DATEOF



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

Вопрос: как её исправить, чтобы она всё равно суммировала данные на сегодня, если есть что-то подходящее завтра или послезавтра?...
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40024345
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал в итоге так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
WITH CTE_SOME AS (
    SELECT LINK_ID, DATEOF, ... FROM SOMETABLE
    UNION ALL
    SELECT LINK_ID, DATEOF - 1, ... FROM SOMETABLE
    UNION ALL
    SELECT LINK_ID, DATEOF - 2, ... FROM SOMETABLE)
SELECT LINK_ID, DATEOF, SUM(...), ... FROM CTE_SOME
GROUP BY LINK_ID, DATEOF;


Может какие-нибудь советы/замечания будут? :)
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40024395
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT D0.LINK_ID, D0.DATEOF, 
       ISNULL(SUM(...), 0) + ISNULL(
    (SELECT SUM(...) FROM SOMETABLE D1 
      WHERE D0.LINK_ID = D1.LINK_ID 
        AND D1.DATEOF BETWEEN D0.DATEOF + 1 AND D0.DATEOF + 2), 0),
   ...
  FROM SOMETABLE D0
GROUP BY D0.LINK_ID, D0.DATEOF

?
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40024419
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

Там принципиально чтобы отдельные даты были отдельными строками, т.е. сумма выглядит как-то так:
Код: sql
1.
SUM(D0.A1), SUM(D0.A2 + D1.A1), SUM(D0.A3 + D1.A2 + D2.A1)


В новом варианте я просто сдвигаю поля на одно после UNION ALL и суммирую уже только по одному полю.
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40025205
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Вопрос: как её исправить, чтобы она всё равно суммировала данные на сегодня, если есть что-то подходящее завтра или послезавтра?...
Брать правой таблицей календарь.
А уже к нему прицеплять левые самтэйблы.
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40025243
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery
Брать правой таблицей календарь.
А уже к нему прицеплять левые самтэйблы.

Логично.
А можно как-то календарь загнать в SELECT? Типа
Код: sql
1.
select current_date - row_number dateof from rdb$database where dateof > current_date - 30

?
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40025247
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40025257
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис

Это производственный календарь, с выходными и праздниками. Мне же нужен тупо счётчик от и до.
Можно сделать ХП, да. Но, возможно, можно как-то тупо в SELECT загнать?
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40025259
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

возможно. Но через WITH RECURSIVE вы будете ограничены 1023 днями. А джойнить левые таблицы для этого это костыль

Код: sql
1.
2.
3.
4.
5.
6.
with recursive r(d) as (
  select current_date - 30 from rdb$database
  union all
  select d + 1 from r where d < current_date
)
select d from r
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40025268
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Но через WITH RECURSIVE вы будете ограничены 1023 днями
Это только если в лоб делать
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40025271
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Но через WITH RECURSIVE вы будете ограничены 1023 днями.

1023 дня - это почти 3 года. Кому нужно столько информации на экране?..
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40025311
Dimbuch®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
alekcvp,

Но через WITH RECURSIVE вы будете ограничены 1023 днями


Обычно обхожу ограничение через процедуру, вывожу сколько требуется, порциями по 1000 строк:

Код: sql
1.
2.
3.
4.
5.
WHILE <= нужный интервал
BEGIN
  WITH RECURSIVE 
    ... Запрос на 1000 строк
END
...
Рейтинг: 0 / 0
Рекурсивный JOIN
    #40025331
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По всевозможным счётчикам тем в форуме уже множество.
Вот из свежего 22214012
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Рекурсивный JOIN
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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