#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.