powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализация задачи с помощью запроса
9 сообщений из 9, страница 1 из 1
Реализация задачи с помощью запроса
    #39332148
Adylov Timur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Помогите с решением задачи.
У меня есть таблица с 5-ю полями
1) МХ number
2) ТП number
3) ОСТ number
4) НОСТ number
5) ДСГ date

Необходимо провести преобразования
В разрезе МХ-ТП отсортировать по возрастанию ДСГ.
Первому найденному (в каждом разрезе МХ-ТП) присвоить
НОСТ(1) = 0
Остальным применить формулу
НОСТ(n) = ОСТ(n) + max(0;HOCT(n-1))

Количество записей около 200 млн.
Как сделать в цикле я знаю. Но хотелось бы реализовать с помощью запроса
Подскажите, если это возможно сделать.

Заранее всем спасибо!!
...
Рейтинг: 0 / 0
Реализация задачи с помощью запроса
    #39332151
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adylov TimurПодскажите, если это возможно сделать.
Гугли "аналитические функции, нарастающий итог".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Реализация задачи с помощью запроса
    #39332153
Adylov Timur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAdylov TimurПодскажите, если это возможно сделать.
Гугли "аналитические функции, нарастающий итог".


Оконные функции работают с уже готовым столбцом, а не со столбцом, который формируется во время запросы
...
Рейтинг: 0 / 0
Реализация задачи с помощью запроса
    #39332185
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
WITH T AS (
           SELECT  MX,
                   TП,
                   ОСТ,
                   ДСГ,
                   CASE ROW_NUMBER() OVER(PARTITION BY MX,TП ORDER BY ДСГ) RN
             FROM  ТВОЯ_ТАБЛИЦА
          ),
   R(
     MX,
     TП,
     ОСТ,
     ДСГ,
     HOCT
     RN
    ) AS (
           SELECT  MX,
                   TП,
                   ОСТ,
                   ДСГ,
                   0,
                   RN
             FROM  T
             WHERE RN = 1
          UNION ALL
           SELECT  T.MX,
                   T.TП,
                   T.ОСТ,
                   T.ДСГ,
                   T.OCT + GREATEST(0,R.HOCT),
                   T.RN
             FROM  R,
                   T
             WHERE T.RN = R.RN + 1
        )
SELECT  MX,
        TП,
        ОСТ,
        ДСГ,
        HOCT
  FROM  R
  ORDER BY MX,
           TП,
           RN
/



SY.
...
Рейтинг: 0 / 0
Реализация задачи с помощью запроса
    #39332281
Adylov Timur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Идея понятна, спасибо, буду сейчас реализовывать, но пока не уверен, что у меня это быстро сработает, как говорил ранее 200 млн. записей, а в запросе сначала выполняется аналитика, а потом соединение в рекурсии.
...
Рейтинг: 0 / 0
Реализация задачи с помощью запроса
    #39332306
Adylov Timur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
......
           SELECT  MX,
                   TП,
                   ОСТ,
                   ДСГ,
                   0,
                   RN
             FROM  T
             WHERE RN = 1
          UNION ALL
           SELECT  T.MX,
                   T.TП,
                   T.ОСТ,
                   T.ДСГ,
                   T.OCT + GREATEST(0,R.HOCT),
                   T.RN
             FROM  R,
                   T
             WHERE T.RN = R.RN + 1
                 AND Т.МХ = R.МХ 
                 AND Т.ТП = R.ТП
......
/



SY.

Вроде работает на маленьких объемах, только надо было ещё дописать
AND Т.МХ = R.МХ
AND Т.ТП = R.ТП
Спасибо, очень благодарен. Сейчас буду тестировать на больших объемах
...
Рейтинг: 0 / 0
Реализация задачи с помощью запроса
    #39332312
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adylov TimurSY,

Идея понятна, спасибо, буду сейчас реализовывать, но пока не уверен, что у меня это быстро сработает, как говорил ранее 200 млн. записей, а в запросе сначала выполняется аналитика, а потом соединение в рекурсии.

Хотя, если я чего-то не упустил, рекурсия тут не нужна - только аналитика:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT  MX,
        ТП,
        ДСГ,
        OCT,
        NVL(
            OCT  - FIRST_VALUE(GREATEST(0,OCT)) OVER(
                                                     PARTITION BY MX,ТП
                                                     ORDER BY ДСГ
                                                    ) + 
            SUM(GREATEST(0,OCT)) OVER(
                                      PARTITION BY MX,ТП
                                      ORDER BY ДСГ
                                      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
                                     ),
            0
           ) HOCT
  FROM  ТВОЯ_ТАБЛИЦА
  ORDER BY MX,
           ТП,
           ДСГ
/



Например:

Код: 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.
drop table tbl purge
/
create table tbl as (
           select 1 mx,2 tp,1 dsg,5 oct from dual union all
           select 1,2,3,-7 from dual union all
           select 1,2,7,-10 from dual union all
           select 1,2,11,15 from dual union all
           select 1,2,15,18 from dual union all
           select 1,2,16,25 from dual union all
           select 1,2,27,-35 from dual union all
           select 1,2,38,20 from dual
          )
/
SQL> select  *
  2    from  tbl
  3  /

        MX         TP        DSG        OCT
---------- ---------- ---------- ----------
         1          2          1          5
         1          2          3         -7
         1          2          7        -10
         1          2         11         15
         1          2         15         18
         1          2         16         25
         1          2         27        -35
         1          2         38         20

8 rows selected.

SELECT  MX,
        TP,
        DSG,
        OCT,
        NVL(
            OCT  - FIRST_VALUE(GREATEST(0,OCT)) OVER(
                                                     PARTITION BY MX,TP
                                                     ORDER BY DSG
                                                    ) + 
            SUM(GREATEST(0,OCT)) OVER(
                                      PARTITION BY MX,TP
                                      ORDER BY DSG
                                      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
                                     ),
            0
           ) HOCT
  FROM  TBL
  ORDER BY MX,
           TP,
           DSG
/

        MX         TP        DSG        OCT       HOCT
---------- ---------- ---------- ---------- ----------
         1          2          1          5          0
         1          2          3         -7         -7
         1          2          7        -10        -10
         1          2         11         15         15
         1          2         15         18         33
         1          2         16         25         58
         1          2         27        -35         23
         1          2         38         20         78

8 rows selected.

SQL>  



SY.
...
Рейтинг: 0 / 0
Реализация задачи с помощью запроса
    #39332490
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь понять вот эту конструкцию и пока не получается.
Код: 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.
R(
     MX,
     TП,
     ОСТ,
     ДСГ,
     HOCT
     RN
    ) AS (
           SELECT  MX,
                   TП,
                   ОСТ,
                   ДСГ,
                   0,
                   RN
             FROM  T
             WHERE RN = 1
          UNION ALL
           SELECT  T.MX,
                   T.TП,
                   T.ОСТ,
                   T.ДСГ,
                   T.OCT + GREATEST(0,R.HOCT),
                   T.RN
             FROM  R,
                   T
             WHERE T.RN = R.RN + 1
        )


Можно обращаться внутри WITH к нему самому?
...
Рейтинг: 0 / 0
Реализация задачи с помощью запроса
    #39332491
Бельфя,

в версиях Oracle, поддерживающих рекурсивный WITH - можно
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализация задачи с помощью запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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