Почему подзапрос OLAP вызывает проблему при использовании в представлении, но работает иначе в DB2 для i?

#db2 #db2-400

#db2 #db2-400

Вопрос:

Я пытаюсь превратить строки в ограниченное количество столбцов, пропуская пустые строки, и возвращаю количество непустых строк. Я смог обойти это ограничение, поэтому меня больше интересует причина, по которой следующее работает как отдельный оператор, но завершается неудачей, когда ему предшествует CREATE VIEW TEST AS ?

 with temp (id,line) as (
  values (1, 'line a'),
         (1, 'line b'),
         (1, null),
         (1, 'line d'),
         (1, 'line e'),
         (1, 'line f'),
         (2, null),
         (2, 'line b'),
         (2, 'line c') 
),
temp2 as (
  select id, line,
   row_number() over (partition by id) rn,
   sum(1) over (partition by id) rows
  from temp
  where line is not null
),
temp3 as (
  select id,
   min(case when rn = 1 then line end) line1,
   min(case when rn = 2 then line end) line2,
   min(case when rn = 3 then line end) line3,
   rows
  from temp2
  group by id,rows
)
select * from temp3
 

Выполнение приведенного выше как есть дает мне ожидаемый результат:

 ID  LINE1   LINE2   LINE3   ROWS
1   line a  line b  line d  5
2   line b  line c       -  2
 

Но при предварении create view test as им выдает следующую ошибку:

 SQL State: 42803 Vendor Code: -122 Message: [SQL0122] Column ID or expression in SELECT list not valid. Cause . . . . . :   One of the following has occurred: -- The statement contains column name ID and an aggregate function in the SELECT clause and no GROUP BY clause is specified. -- Column name ID is specified in the SELECT clause but not in the GROUP BY clause. -- An expression is specified in the SELECT clause but not in the GROUP BY clause. -- A column or expression that is specified in the ORDER BY clause, but not in the SELECT clause, does not conform to the grouping rules listed above. Recovery  . . . :   Do one of the following and try the request again: -- If a GROUP BY clause is required, make certain that all columns or expressions in the SELECT list and ORDER BY clause are also in the GROUP BY clause. -- If a GROUP BY clause is not needed, the SELECT list and ORDER BY clause should not contain aggregate functions with column names.
 

Я знаю, что ошибка вводит в заблуждение, потому что, если я удаляю ссылку на rows from temp3 , она выполняется нормально. Так что это связано конкретно с тем, что оператор OLAP ( sum(1) over (partition by id) rows ) является частью подзапроса, но я не понимаю, почему он работает нормально в одну сторону, а не в другую. Я не смог найти документацию, почему это не должно выполняться как есть.

Комментарии:

1. Ваш пример представления отлично работает в Db2 11.5 LUW. Я предполагаю, что это дефект в используемой вами версии Db2 для i. Я предлагаю вам обратиться в службу поддержки IBM

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