Предложение диапазона оконной функции Informix ведет себя как предложение строк - PullRequest
3 голосов
/ 15 марта 2019

Рассмотрим это утверждение в Informix :

SELECT 
  a, 
  b,
  sum(a) over (order by b) "no frame",
  sum(a) over (order by b range between unbounded preceding and current row) "range",
  sum(a) over (order by b rows between unbounded preceding and current row) "rows"
FROM TABLE(SET{row(1, 1), row(2, 1), row(3, 2), row(4, 2)}) AS t(a, b);

Удивительно, но он дает одинаковый результат для range и rows:

a |b |no frame |range |rows |
--|--|---------|------|-----|
1 |1 |3        |1     |1    |
2 |1 |3        |3     |3    |
3 |2 |10       |6     |6    |
4 |2 |10       |10    |10   |

Это работает совершенно иначе, чем в любой СУБД, к которой я привык, включая PostgreSQL :

SELECT 
  a, 
  b,
  sum(a) over (order by b) "no frame",
  sum(a) over (order by b range between unbounded preceding and current row) "range",
  sum(a) over (order by b rows between unbounded preceding and current row) "rows"
FROM (values(1, 1), (2, 1), (3, 2), (4, 2)) AS t(a, b);

... который производит ожидаемый

a |b |no frame |range |rows |
--|--|---------|------|-----|
1 |1 |3        |3     |1    |
2 |1 |3        |3     |3    |
3 |2 |10       |10    |6    |
4 |2 |10       |10    |10   |

Есть ли тонкая разница между Informix и стандартным SQL, которую я пропускаю, или это ошибка? Я использую официальный образ докера , который соответствует Informix 12.10 на данный момент.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

В качестве обходного пути я могу использовать 0 PRECEDING (что недопустимо, ну да ладно) вместо CURRENT ROW.Это дает результат, который я ожидал:

SELECT 
  a, 
  b,
  sum(a) over (order by b) "no frame",
  sum(a) over (order by b range between unbounded preceding and 0 preceding) "range",
  sum(a) over (order by b rows between unbounded preceding and current row) "rows"
FROM (values(1, 1), (2, 1), (3, 2), (4, 2)) AS t(a, b);

Теперь я получаю:

a |b |no frame |range |rows |
--|--|---------|------|-----|
1 |1 |3        |3     |1    |
2 |1 |3        |3     |3    |
3 |2 |10       |10    |6    |
4 |2 |10       |10    |10   |
1 голос
/ 15 марта 2019

Это документированное поведение:

Если вы укажете предложение ORDER, но не предложение оконной рамы для функции агрегации окон, то по умолчанию все строки, предшествующие текущейвозвращаются строка и текущая строка, что эквивалентно следующей спецификации фрейма окна:

ROWS МЕЖДУ ОБЪЕДИНЕННЫМ PRECEDING И CURRENT ROW

Я считаю, что стандартом является RANGE, когда нетпункт оконного предложения присутствует.Я уверен, что это значение по умолчанию в большинстве других баз данных.

...