powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / агрегация в подгруппах (start_of_group)
2 сообщений из 2, страница 1 из 1
агрегация в подгруппах (start_of_group)
    #39415513
(o-O)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые,
помогите пожалуйста дописать запрос связанный с группировками строк.

имеется следующий набор данных

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
WITH test AS ( SELECT TO_DATE('01.01.2016') dt, 1 marker, 0 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('02.01.2016') dt, 1 marker, 0 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('03.01.2016') dt, 1 marker, 0 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('04.01.2016') dt, 0 marker, 10 cash, 'Y' priznak FROM dual
     UNION ALL SELECT TO_DATE('05.01.2016') dt, 0 marker, 20 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('06.01.2016') dt, 0 marker, 20, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('07.01.2016') dt, 0 marker, 30 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('08.01.2016') dt, 1 marker, 30 cash, 'Y' priznak FROM dual
     UNION ALL SELECT TO_DATE('09.01.2016') dt, 0 marker, 40 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('10.01.2016') dt, 0 marker, 40 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('11.01.2016') dt, 0 marker, 30 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('12.01.2016') dt, 1 marker, 50 cash, 'Y' priznak FROM dual
     UNION ALL SELECT TO_DATE('13.01.2016') dt, 0 marker, 20 cash, NULL priznak FROM dual  
     UNION ALL SELECT TO_DATE('14.01.2016') dt, 0 marker, 30 cash, NULL priznak FROM dual                               
)
SELECT dt, priznak, marker, cash,
       SUM(cash) OVER (ORDER BY dt) cash_sum,
       ROW_NUMBER() OVER (ORDER BY dt) ordering,
       NULL AS cash_long        
FROM test



Требуется вычислить три колонки - cash_sum, ordering, cash_long

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
dt	      priznak	marker	cash	cash_sum      ordering      cash_long
01.01.2016	 	1	0	0	      1	            0
02.01.2016	 	1	0	0	      1	            0
03.01.2016	 	1	0	0	      1	            0
04.01.2016	Y	0	10	10	      1	            10
05.01.2016	 	0	20	30	      2	            10
06.01.2016	 	0	20	50	      3	            10
07.01.2016	 	0	30	80	      4	            10
08.01.2016	Y	1	30	30	      1	            30
09.01.2016	 	0	40	70	      2	            30
10.01.2016	 	0	40	110	      3	            30
11.01.2016	 	0	30	140	      4	            30
12.01.2016	Y	1	50	50	      1	            50
13.01.2016	 	0	20	70	      2	            50
14.01.2016	 	0	30	100	      3	            50




cash_sum - это накапливающая сумма колонки cash в тех последовательных строках по dt где marker=0, если marker=1 то начиная с этой строки сумма накапливается сначала.
ordering - нумерация строк отсортированных по dt. номер 1 присваивается строке в которой marker=1 или первой строке в группе с marker=0 (у нее priznak=Y)
cash_long - в рамках того же самого окна (где marker=0 протянуть сумму cash из 1й строки группы (priznak=Y))

Полагаю что поле marker нужно сопоставить с полей start_of_group?
...
Рейтинг: 0 / 0
агрегация в подгруппах (start_of_group)
    #39415540
(o-O)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(o-O),

Поле marker я ввел сам для возможности агрегации по окнам. Но возможно я его не правильно заполняю.
Сейчас я решил ставить в нем 1 там где нет cash и там где priznak=Y.
По этой логике в исходном наборенаборе у 4янвсря должна быть 1.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
WITH test AS ( SELECT TO_DATE('01.01.2016') dt, 1 marker, 0 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('02.01.2016') dt, 1 marker, 0 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('03.01.2016') dt, 1 marker, 0 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('04.01.2016') dt, 1 marker, 10 cash, 'Y' priznak FROM dual
     UNION ALL SELECT TO_DATE('05.01.2016') dt, 0 marker, 20 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('06.01.2016') dt, 0 marker, 20, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('07.01.2016') dt, 0 marker, 30 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('08.01.2016') dt, 1 marker, 30 cash, 'Y' priznak FROM dual
     UNION ALL SELECT TO_DATE('09.01.2016') dt, 0 marker, 40 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('10.01.2016') dt, 0 marker, 40 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('11.01.2016') dt, 0 marker, 30 cash, NULL priznak FROM dual
     UNION ALL SELECT TO_DATE('12.01.2016') dt, 1 marker, 50 cash, 'Y' priznak FROM dual
     UNION ALL SELECT TO_DATE('13.01.2016') dt, 0 marker, 20 cash, NULL priznak FROM dual  
     UNION ALL SELECT TO_DATE('14.01.2016') dt, 0 marker, 30 cash, NULL priznak FROM dual                               
)
SELECT dt, priznak, marker, cash,
       SUM(cash) OVER (ORDER BY dt) cash_sum,
       ROW_NUMBER() OVER (ORDER BY dt) ordering,
       NULL AS cash_long        
FROM test
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / агрегация в подгруппах (start_of_group)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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