powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос. Объединение нескольких записей в развернутую таблицу
23 сообщений из 23, страница 1 из 1
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711752
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Задача состоит получить из таблицы вида

DTSKLR31.05.2018 0:0511.5001.39631.05.2018 0:0621.5001.46031.05.2018 0:0831.5001.64431.05.2018 0:0941.5001.81031.05.2018 0:1011.6001.53631.05.2018 0:1121.6001.56331.05.2018 0:1331.6001.64531.05.2018 0:1441.6001.69631.05.2018 0:1650.9001.13931.05.2018 0:1661.0001.13931.05.2018 0:1811.0001.13931.05.2018 0:1921.2001.25931.05.2018 0:2510.9001.52731.05.2018 0:2621.0001.52831.05.2018 0:2731.1001.59631.05.2018 0:2941.2001.91731.05.2018 0:3250.7001.528

таблицу

DT1SK1L1R1DT2SK2L2R231.05.2018 0:0621.5001.46031.05.2018 0:0941.5001.81031.05.2018 0:1121.6001.56331.05.2018 0:1661.0001.13931.05.2018 0:1921.2001.25931.05.2018 0:1921.2001.25931.05.2018 0:2621.0001.52831.05.2018 0:3250.7001.528

т.е. при отсортированных записях по дате склеиваются 2 строки: стока где поле SK=2 и строка где поле SK = максимальному локальному значению (в след строке уже SK = 1)

Просьба поделится идеями. Спасибо)
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711759
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983Просьба поделится идеями.

Тривиальная задача на стороне клиентского приложения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711773
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovkaktus1983Просьба поделится идеями.

Тривиальная задача на стороне клиентского приложения.

клиентского приложения нет, впрочем и серверного тоже.
это лишь звено в цепочке анализа информации в БД
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711777
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983это лишь звено в цепочке анализа информации в БД

Значит красивое представление в виде широкой таблицы не имеет смысла. Анализируй в
вертикальном формате.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711785
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983Dimitry Sibiryakovпропущено...

Тривиальная задача на стороне клиентского приложения.

клиентского приложения нет, впрочем и серверного тоже.
это лишь звено в цепочке анализа информации в БД
Хотя, можно и ХП написать, но ХП все равно фиксированное число столбцов возвращает, тут разве что возвращать длинные строки с разделителями полей (или с полями фиксированной длины).
Имхо, лучше на клиенте сделать, совсем несложно.
Есть готовые библиотеки для "красивого" анализа, например - https://www.fastreport.ru/ru/product/fast-cube-2/
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711787
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
хорошо, согласен - можно обойтись и без развернутой таблицы.
Задачу перефразирую: необходимо получить вторую часть таблицы:

DT2SK2L2R231.05.2018 0:0941.5001.81031.05.2018 0:1661.0001.13931.05.2018 0:1921.2001.25931.05.2018 0:3250.7001.528
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711791
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Котовасия,
приложения нет, инженерный анализ при помощи IBExpert и Excel
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711792
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983Котовасия,
приложения нет, инженерный анализ при помощи IBExpert и Excel
Ну тем более.
В IBExpert встроен FastReport, в том числе с кросс-табами.
В MS Excel вообще что хочешь можно.
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711796
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Котовасия,
спасибо, посмотрю насчет FR в IBExpert, не знал.
И все же, интересно, как запросом получить из исходной таблицы таблицу

DT2SK2L2R231.05.2018 0:0941.5001.81031.05.2018 0:1661.0001.13931.05.2018 0:1921.2001.25931.05.2018 0:3250.7001.528
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711802
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983Котовасия,
спасибо, посмотрю насчет FR в IBExpert, не знал.
И все же, интересно, как запросом получить из исходной таблицы таблицу

DT2SK2L2R231.05.2018 0:0941.5001.81031.05.2018 0:1661.0001.13931.05.2018 0:1921.2001.25931.05.2018 0:3250.7001.528
Если заранее не знаешь число выходных столбцов - то никак.
Если знаешь - то методом изучения главы 6 книги Мартина Грабера: http://specfx.narod.ru/books/SQL_M_Gruber.pdf
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711815
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983,

Хранимка или Execute Block. Внутри for select. Перебором находишь нужные значения, их присваиваешь в локальные переменные (8 штук). Когда ряд заполнится, делаешь suspend.
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39711913
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие прилежные студенты пошли. До сессии ещё 3 месяца, а уже напрягаются.
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712040
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Котовасия,

За книгу спасибо!
Насчет кол-ва столбцов: для упрощения задача сводится к получению подмножества записей исходной таблицы
путем выбора строк, где поле SK = максимальному локальному значению (в след строке уже SK = 1)

Исходная:
DTSKLR31.05.2018 0:0511.5001.39631.05.2018 0:0621.5001.46031.05.2018 0:0831.5001.64431.05.2018 0:0941.5001.81031.05.2018 0:1011.6001.53631.05.2018 0:1121.6001.56331.05.2018 0:1331.6001.64531.05.2018 0:1441.6001.69631.05.2018 0:1650.9001.13931.05.2018 0:1661.0001.13931.05.2018 0:1811.0001.13931.05.2018 0:1921.2001.25931.05.2018 0:2510.9001.52731.05.2018 0:2621.0001.52831.05.2018 0:2731.1001.59631.05.2018 0:2941.2001.91731.05.2018 0:3250.7001.528

Результат:
DTSKLR31.05.2018 0:0941.5001.81031.05.2018 0:1661.0001.13931.05.2018 0:1921.2001.25931.05.2018 0:3250.7001.528

Можно ли это сделать прямым запросом?
с помощью SP или Execute Block как сделать знаю.
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712041
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI,
Такой вариант тоже пришел в голову, но есть предположение что можно это сделать проще
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712045
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Старый плюшевый мишка,
у вас куда не глянь - одни студенты вокруг!
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712244
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983,

С его опытом, он вас даже без постов, просто по никам видит.
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712267
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CREATE TABLE T (
    DT  TIMESTAMP,
    SK  INTEGER,
    L   DOUBLE PRECISION,
    R   DOUBLE PRECISION
);

INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:05:00', 1, 1.5, 1.396);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:06:00', 2, 1.5, 1.46);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:08:00', 3, 1.5, 1.644);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:09:00', 4, 1.5, 1.81);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:10:00', 1, 1.6, 1.536);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:11:00', 2, 1.6, 1.563);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:13:00', 3, 1.6, 1.645);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:14:00', 4, 1.6, 1.696);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:16:00', 5, 0.9, 1.139);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:16:00', 6, 1, 1.139);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:18:00', 1, 1, 1.139);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:19:00', 2, 1.2, 1.259);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:25:00', 1, 0.9, 1.527);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:26:00', 2, 1, 1.528);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:27:00', 3, 1.1, 1.596);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:29:00', 4, 1.2, 1.917);
INSERT INTO T (DT, SK, L, R)
       VALUES ('2018-05-31 00:32:00', 5, 0.7, 1.528);


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
with cte1 as (
    select
        T.*
        ,row_number()over(order by DT) as rn
    from T
    where SK=2),
cte2 as (
    select
         t1.rn
         ,T.*
         ,row_number()over(partition by t1.rn order by T.SK desc) as flag
    from cte1 t1 left join cte1 t2 on t1.rn=t2.rn-1
    inner join T on T.DT >= t1.DT and (T.DT < t2.DT or t2.DT is null)
)

select
    cte1.DT as DT1
    ,cte1.SK as SK1
    ,cte1.L as L1
    ,cte1.R as R1

    ,cte2.DT as DT2
    ,cte2.SK as SK2
    ,cte2.L as L2
    ,cte2.R as R2

from cte1 inner join cte2 on cte1.rn=cte2.rn
where cte2.flag=1


DT1SK1L1R1DT2SK2L2R231.05.2018 0:0621,501,4631.05.2018 0:0941,501,8131.05.2018 0:1121,601,5631.05.2018 0:1661,001,1431.05.2018 0:1921,201,2631.05.2018 0:1921,201,2631.05.2018 0:2621,001,5331.05.2018 0:3250,701,53
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712465
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
без оконных функций

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select t3.*
from (select GRP.GRP_DT, max(GRP.DT) as DT, max(GRP.SK) as SK
      from (select
              t1.DT,
              cast(iif(t2.DT is not null, t2.DT - iif(RDB$SET_CONTEXT('USER_TRANSACTION', 'DT', t2.DT) = 0, 0, 0), RDB$GET_CONTEXT('USER_TRANSACTION', 'DT')) as timestamp) as GRP_DT,
              coalesce(t2.SK, t1.SK) as SK,
              coalesce(t2.L, t1.L) as L,
              coalesce(t2.R, t1.R) as R
            from T t1
            left join T t2 on t1.DT = t2.DT and t2.SK = 2
            order by iif(t1.SK = 2, (select first 1 DT - 0.00000001 from T where DT < t1.DT order by DT desc, SK desc), t1.DT), t1.SK) as GRP
      group by GRP.GRP_DT) as M
join T t3 on t3.DT = M.DT and t3.SK = M.SK
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712493
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

прикольный запрос. Надо бы ещё индексы правильные сделать, если это вообще возможно. А то совсем неэффективно. Для реала не годиться, только может быть для изучения SQL.

vvvait,

ещё более неэффективнее. Притом, что выдаётся не совсем то, что нужно ТС.
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712500
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreatorXXI,
авторЗадачу перефразирую: необходимо получить вторую часть таблицы
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712507
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если добавить индекс становится весьма оптимально
CREATE INDEX T_IDX1 ON T (DT, SK);

PLAN SORT ((M GRP T INDEX (T_IDX1)))
PLAN JOIN (SORT (SORT (JOIN (M GRP T1 NATURAL, M GRP T2 INDEX (T_IDX1)))), T3 INDEX (T_IDX1))
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712814
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvait,

совсем другое дело. Но, всё равно, банальный однопроходный for select эффективнее будет, наверно.
...
Рейтинг: 0 / 0
Запрос. Объединение нескольких записей в развернутую таблицу
    #39712866
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, vvvait,
Спасибо за предложения!
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос. Объединение нескольких записей в развернутую таблицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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