У меня есть следующая таблица базы данных:
date a b c d add result
23.02.07 A B C1 D1 1 1
24.02.07 A B C1 D1 0 1
25.02.07 A B C1 D1 1 2
26.02.07 A B C1 D1 1 3
27.02.07 A B C1 D1 1 4
28.02.07 A B C1 D1 0 4
01.03.07 A B C1 D1 0 4
02.03.07 A B C1 D1 0 4
03.03.07 A B C1 D1 1 5
04.03.07 A B C1 D1 0 5
05.03.07 A B C1 D1 0 5
06.03.07 A B C1 D1 0 5
07.03.07 A B C1 D1 2 7
17.02.07 A B C2 D2 1 1
18.02.07 A B C2 D2 0 1
19.02.07 A B C2 D2 0 1
20.02.07 A B C2 D2 0 1
21.02.07 A B C2 D2 0 1
22.02.07 A B C2 D2 0 1
23.02.07 A B C2 D2 0 1
24.02.07 A B C2 D2 0 1
25.02.07 A B C2 D2 1 2
26.02.07 A B C2 D2 3 5
27.02.07 A B C2 D2 1 6
28.02.07 A B C2 D2 0 6
Результат столбца (последний) не является частью фактического набора данных. В этой колонке показано, чего я пытаюсь достичь. По сути, я суммирую все предыдущие значения «добавить» и текущее значение данного раздела, используя аналитическую функцию, как показано ниже:
SUM(add) OVER(PARTITION BY
A,
B,
C,
D,
ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS result
Этот подход работает, но работает медленно при запросе больших коллекций данных.
Еще немного информации:
- По дате существует индекс btree (это не тип данных даты, а переменный символ).
- Все остальные являются переменными символами вместо добавления, которое является целым числом.
- A и B также имеют индекс btree.
Есть ли лучший/более эффективный способ сделать это?
create index idx_covering on mytable(a,b,c,d,date,add);
. - person Thorsten Kettner   schedule 06.02.2017