powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Интересный запрос
3 сообщений из 3, страница 1 из 1
Интересный запрос
    #39894260
VanDOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Есть большая таблица с атрибутами физ. лиц.
Каждый субъект характеризуется набором атрибутов (строки), сгруппированных в один блок. Блок атрибутов по каждому физику обязательно начинается с атрибута ID01 , и заканчивается одним из взаимоисключающих атрибутов [TR01, IP01, LE01, BC01] , в этих же атрибутах (TR01, IP01, LE01, BC01) содержится и ID самого субъекта. Атрибуты строго упорядочены по полю PK. Количество атрибутов внутри каждого блока может быть различным (но начальный и завершающий атрибуты - фиксированы).
То есть, в таблице ниже мы видим 4 блока, соответственно 4 разных субъекта (PK: 2-5 ; 6-10 ; 11-15 ; 16-21).

PK ATTR VALUE комментарий 2ID01Документ // начало блока 1 3NA01ФИО4AD01Адрес5TR01111 // конец блока 1 6ID01Документ 1 // начало блока 2 7ID02Документ 28NA01ФИО9AD01Адрес10IP01222 // конец блока 2 11ID01Документ // начало блока 3 12NA01ФИО13AD01Адрес 114AD02Адрес 215LE01333 // конец блока 3 16ID01Документ 1 // начало блока 4 17ID02Документ 218NA01ФИО19AD01Адрес 120AD02Адрес 221BC01444 // конец блока 4

Нужно построить запрос таким образом, чтобы каждый атрибут был однозначно отнесен к своему ID субъекта.
Результат должен быть таким:

PERSON_ID PK ATTR VALUE 1112ID01Документ1113NA01ФИО1114AD01Адрес1115TR011112226ID01Документ 12227ID02Документ 22228NA01ФИО2229AD01Адрес22210IP0122233311ID01Документ33312NA01ФИО33313AD01Адрес 133314AD02Адрес 233315LE0133344416ID01Документ 144417ID02Документ 244418NA01ФИО44419AD01Адрес 144420AD02Адрес 244421BC01444

Буду благодарен за помощь.


SELECT , генерирующий тестовую выборку представленную выше:
Код: plsql
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.
42.
43.
44.
WITH T
     AS (SELECT 2 AS pk, 'ID01' AS attr, 'Документ' AS VALUE
           FROM DUAL
         UNION
         SELECT 3, 'NA01', 'ФИО' FROM DUAL
         UNION
         SELECT 4, 'AD01', 'Адрес' FROM DUAL
         UNION
         SELECT 5, 'TR01', '111' FROM DUAL
         UNION
         SELECT 6, 'ID01', 'Документ 1' FROM DUAL
         UNION
         SELECT 7, 'ID02', 'Документ 2' FROM DUAL
         UNION
         SELECT 8, 'NA01', 'ФИО' FROM DUAL
         UNION
         SELECT 9, 'AD01', 'Адрес' FROM DUAL
         UNION
         SELECT 10, 'IP01', '222' FROM DUAL
         UNION
         SELECT 11, 'ID01', 'Документ' FROM DUAL
         UNION
         SELECT 12, 'NA01', 'ФИО' FROM DUAL
         UNION
         SELECT 13, 'AD01', 'Адрес 1' FROM DUAL
         UNION
         SELECT 14, 'AD02', 'Адрес 2' FROM DUAL
         UNION
         SELECT 15, 'LE01', '333' FROM DUAL
         UNION
         SELECT 16, 'ID01', 'Документ 1' FROM DUAL
         UNION
         SELECT 17, 'ID02', 'Документ 2' FROM DUAL
         UNION
         SELECT 18, 'NA01', 'ФИО' FROM DUAL
         UNION
         SELECT 19, 'AD01', 'Адрес 1' FROM DUAL
         UNION
         SELECT 20, 'AD02', 'Адрес 2' FROM DUAL
         UNION
         SELECT 21, 'BC01', '444' FROM DUAL)
  SELECT *
    FROM T
ORDER BY pk ASC;
...
Рейтинг: 0 / 0
Интересный запрос
    #39894269
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanDOS,

last_value
...
Рейтинг: 0 / 0
Интересный запрос
    #39894270
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanDOS,

Код: plsql
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
SQL> ed
Wrote file afiedt.buf

  1  WITH T
  2       AS (SELECT 2 AS pk, 'ID01' AS attr, 'Документ' AS VALUE
  3             FROM DUAL
  4           UNION
  5           SELECT 3, 'NA01', 'ФИО' FROM DUAL
  6           UNION
  7           SELECT 4, 'AD01', 'Адрес' FROM DUAL
  8           UNION
  9           SELECT 5, 'TR01', '111' FROM DUAL
 10           UNION
 11           SELECT 6, 'ID01', 'Документ 1' FROM DUAL
 12           UNION
 13           SELECT 7, 'ID02', 'Документ 2' FROM DUAL
 14           UNION
 15           SELECT 8, 'NA01', 'ФИО' FROM DUAL
 16           UNION
 17           SELECT 9, 'AD01', 'Адрес' FROM DUAL
 18           UNION
 19           SELECT 10, 'IP01', '222' FROM DUAL
 20           UNION
 21           SELECT 11, 'ID01', 'Документ' FROM DUAL
 22           UNION
 23           SELECT 12, 'NA01', 'ФИО' FROM DUAL
 24           UNION
 25           SELECT 13, 'AD01', 'Адрес 1' FROM DUAL
 26           UNION
 27           SELECT 14, 'AD02', 'Адрес 2' FROM DUAL
 28           UNION
 29           SELECT 15, 'LE01', '333' FROM DUAL
 30           UNION
 31           SELECT 16, 'ID01', 'Документ 1' FROM DUAL
 32           UNION
 33           SELECT 17, 'ID02', 'Документ 2' FROM DUAL
 34           UNION
 35           SELECT 18, 'NA01', 'ФИО' FROM DUAL
 36           UNION
 37           SELECT 19, 'AD01', 'Адрес 1' FROM DUAL
 38           UNION
 39           SELECT 20, 'AD02', 'Адрес 2' FROM DUAL
 40           UNION
 41           SELECT 21, 'BC01', '444' FROM DUAL)
 42  , tt as (
 43    SELECT t.*,sum(decode(attr,'ID01',1)) over (order by pk) gr
 44    FROM T)
 45  select tt.*,max(case when attr in ('TR01', 'IP01', 'LE01', 'BC01') then value end) over(partition by gr) id
 46  from tt
 47* ORDER BY pk
SQL> /

        PK ATTR VALUE              GR ID
---------- ---- ---------- ---------- ----------
         2 ID01 Документ            1 111
         3 NA01 ФИО                 1 111
         4 AD01 Адрес               1 111
         5 TR01 111                 1 111
         6 ID01 Документ 1          2 222
         7 ID02 Документ 2          2 222
         8 NA01 ФИО                 2 222
         9 AD01 Адрес               2 222
        10 IP01 222                 2 222
        11 ID01 Документ            3 333
        12 NA01 ФИО                 3 333
        13 AD01 Адрес 1             3 333
        14 AD02 Адрес 2             3 333
        15 LE01 333                 3 333
        16 ID01 Документ 1          4 444
        17 ID02 Документ 2          4 444
        18 NA01 ФИО                 4 444
        19 AD01 Адрес 1             4 444
        20 AD02 Адрес 2             4 444
        21 BC01 444                 4 444

20 rows selected.



ps
конец группы не проверял
если 12-я версия то возможно проще через match_recognize
....
stax
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Интересный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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