Что такое ROWS UNBOUNDED PRECEDING, используемое в Teradata?
Я только начинаю с Teradata, и я столкнулся с упорядоченной аналитической функцией под названием "Ряды без ограничений, предшествующие" в Teradata. Я попробовал несколько сайтов, чтобы узнать о функции, но все они используют сложный пример, объясняющий то же самое. Не могли бы вы предоставить мне наивный пример, чтобы я мог понять основы.
Ответы
Ответ 1
Это предложение "frame" или "range" для оконных функций, которые являются частью стандарта SQL и реализованы во многих базах данных, включая Teradata.
Простым примером может быть вычисление средней суммы за три дня. Я использую синтаксис PostgreSQL для примера, но он будет таким же для Teradata:
WITH data (t, a) AS (
VALUES(1, 1),
(2, 5),
(3, 3),
(4, 5),
(5, 4),
(6, 11)
)
SELECT t, a, avg(a) OVER (ORDER BY t ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
FROM data
ORDER BY t
... что дает:
t a avg
----------
1 1 3.00
2 5 3.00
3 3 4.33
4 5 4.00
5 4 6.67
6 11 7.50
Как вы можете видеть, каждое среднее вычисляется "над" упорядоченным кадром, состоящим из диапазона между предыдущей строкой (1 preceding
) и последующей строкой (1 following
).
Когда вы пишете ROWS UNBOUNDED PRECEDING
, нижняя граница кадра просто бесконечна. Это полезно при вычислении сумм (т.е. "running totals" ), например:
WITH data (t, a) AS (
VALUES(1, 1),
(2, 5),
(3, 3),
(4, 5),
(5, 4),
(6, 11)
)
SELECT t, a, sum(a) OVER (ORDER BY t ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM data
ORDER BY t
приносит...
t a sum
---------
1 1 1
2 5 6
3 3 9
4 5 14
5 4 18
6 11 29
Вот еще одно очень хорошее объяснение функций окна SQL.
Ответ 2
ROWS UNBOUNDED PRECEDING
не является синтаксисом, специфичным для Teradata, это стандартный SQL. Вместе с ORDER BY
он определяет окно, на котором рассчитывается результат.
Логически функция оконной агрегирования вычисляется для каждой строки в PARTITION на основе всех ROWS между начальной строкой и
конечная строка.
Начальные и конечные строки могут быть фиксированными или относительными к
текущей строки на основе следующих ключевых слов:
- UNBOUNDED PRECEDING, все строки перед текущей строкой → исправлены
- UNBOUNDED FOLLOWING, все строки после текущей строки → исправлены
- x PRECEDING, x строк перед текущей строкой → относительный
- y FOLLOWING, y строк после текущей строки → relative
Возможные виды вычислений включают:
- Исходная и конечная строка фиксированы, окно состоит из всех строк раздела, например. Групповая сумма, т.е. суммарные и подробные строки
- Один конец фиксирован, другой по отношению к текущей строке, количество строк увеличивается или уменьшается, например. Текущая общая сумма, оставшаяся сумма.
- Начальная и конечная строки относятся к текущей строке, количество строк в окне фиксировано, например. скользящее среднее по n строкам
Итак, SUM(x) OVER (ORDER BY col ROWS UNBOUNDED PRECEDING)
приводит к суммарной сумме или общей сумме
11 -> 11
2 -> 11 + 2 = 13
3 -> 13 + 3 (or 11+2+3) = 16
44 -> 16 + 44 (or 11+2+3+44) = 60