Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализация задачи с помощью запроса / 9 сообщений из 9, страница 1 из 1
22.10.2016, 18:02
    #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
22.10.2016, 18:21
    #39332151
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация задачи с помощью запроса
Adylov TimurПодскажите, если это возможно сделать.
Гугли "аналитические функции, нарастающий итог".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.10.2016, 18:35
    #39332153
Adylov Timur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация задачи с помощью запроса
Dimitry SibiryakovAdylov TimurПодскажите, если это возможно сделать.
Гугли "аналитические функции, нарастающий итог".


Оконные функции работают с уже готовым столбцом, а не со столбцом, который формируется во время запросы
...
Рейтинг: 0 / 0
22.10.2016, 20:35
    #39332185
SY
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
23.10.2016, 12:40
    #39332281
Adylov Timur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация задачи с помощью запроса
SY,

Идея понятна, спасибо, буду сейчас реализовывать, но пока не уверен, что у меня это быстро сработает, как говорил ранее 200 млн. записей, а в запросе сначала выполняется аналитика, а потом соединение в рекурсии.
...
Рейтинг: 0 / 0
23.10.2016, 14:48
    #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
23.10.2016, 15:22
    #39332312
SY
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
24.10.2016, 08:50
    #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
24.10.2016, 08:57
    #39332491
Реализация задачи с помощью запроса
Бельфя,

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


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