Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос. Объединение нескольких записей в развернутую таблицу / 23 сообщений из 23, страница 1 из 1
02.10.2018, 15:25
    #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
02.10.2018, 15:29
    #39711759
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
kaktus1983Просьба поделится идеями.

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

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

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

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

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

клиентского приложения нет, впрочем и серверного тоже.
это лишь звено в цепочке анализа информации в БД
Хотя, можно и ХП написать, но ХП все равно фиксированное число столбцов возвращает, тут разве что возвращать длинные строки с разделителями полей (или с полями фиксированной длины).
Имхо, лучше на клиенте сделать, совсем несложно.
Есть готовые библиотеки для "красивого" анализа, например - https://www.fastreport.ru/ru/product/fast-cube-2/
...
Рейтинг: 0 / 0
02.10.2018, 15:53
    #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
02.10.2018, 15:57
    #39711791
kaktus1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
Котовасия,
приложения нет, инженерный анализ при помощи IBExpert и Excel
...
Рейтинг: 0 / 0
02.10.2018, 15:58
    #39711792
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
kaktus1983Котовасия,
приложения нет, инженерный анализ при помощи IBExpert и Excel
Ну тем более.
В IBExpert встроен FastReport, в том числе с кросс-табами.
В MS Excel вообще что хочешь можно.
...
Рейтинг: 0 / 0
02.10.2018, 16:04
    #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
02.10.2018, 16:09
    #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
02.10.2018, 16:26
    #39711815
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
kaktus1983,

Хранимка или Execute Block. Внутри for select. Перебором находишь нужные значения, их присваиваешь в локальные переменные (8 штук). Когда ряд заполнится, делаешь suspend.
...
Рейтинг: 0 / 0
02.10.2018, 18:13
    #39711913
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
Какие прилежные студенты пошли. До сессии ещё 3 месяца, а уже напрягаются.
...
Рейтинг: 0 / 0
02.10.2018, 20:22
    #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
02.10.2018, 20:23
    #39712041
kaktus1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
KreatorXXI,
Такой вариант тоже пришел в голову, но есть предположение что можно это сделать проще
...
Рейтинг: 0 / 0
02.10.2018, 20:27
    #39712045
kaktus1983
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
Старый плюшевый мишка,
у вас куда не глянь - одни студенты вокруг!
...
Рейтинг: 0 / 0
03.10.2018, 09:34
    #39712244
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
kaktus1983,

С его опытом, он вас даже без постов, просто по никам видит.
...
Рейтинг: 0 / 0
03.10.2018, 10:11
    #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
03.10.2018, 14:38
    #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
03.10.2018, 15:12
    #39712493
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
court,

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

vvvait,

ещё более неэффективнее. Притом, что выдаётся не совсем то, что нужно ТС.
...
Рейтинг: 0 / 0
03.10.2018, 15:24
    #39712500
vvvait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
KreatorXXI,
авторЗадачу перефразирую: необходимо получить вторую часть таблицы
...
Рейтинг: 0 / 0
03.10.2018, 15:29
    #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
04.10.2018, 10:07
    #39712814
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос. Объединение нескольких записей в развернутую таблицу
vvvait,

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


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