Не можете использовать group by и over(partition by) в одном запросе?

У меня есть стол myTable с 3 колонками. col_1 является INTEGER а остальные 2 столбца DOUBLE, Например, col_1={1, 2}, col_2={0.1, 0.2, 0.3}, Каждый элемент в col_1 состоит из всех значений col_2 а также col_2 повторил значения для каждого элемента в col_1, 3-й столбец может иметь любое значение, как показано ниже:

    col_1 | col_2 | Value
    ----------------------
    1     |  0.1  |  1.0
    1     |  0.2  |  2.0
    1     |  0.2  |  3.0
    1     |  0.3  |  4.0
    1     |  0.3  |  5.0
    2     |  0.1  |  6.0
    2     |  0.1  |  7.0
    2     |  0.1  |  8.0
    2     |  0.2  |  9.0
    2     |  0.3  |  10.0

Я хочу использовать агрегатную функцию SUM() на Value разделение на столбцы col_1 и сгруппированы по col_2, Таблица выше должна выглядеть следующим образом:

    col_1 | col_2 | sum_value
    ----------------------
    1     |  0.1  |  1.0
    1     |  0.2  |  5.0
    1     |  0.3  |  9.0
    2     |  0.1  |  21.0
    2     |  0.2  |  9.0
    2     |  0.3  |  10.0

Я попробовал следующий запрос SQL:

SELECT col_1, col_2, sum(Value) over(partition by col_1) as sum_value
from myTable
GROUP BY col_1, col_2

Но в DB2 v10.5 он выдал следующую ошибку:

SQL0119N  An expression starting with "Value" specified in a SELECT 
clause, HAVING clause, or ORDER BY clause is not specified in the 
GROUP BY clause or it is in a SELECT clause, HAVING clause, or ORDER 
BY clause with a column function and no GROUP BY clause is specified.

Не могли бы вы указать, что не так. У меня нет большого опыта работы с SQL.

Спасибо.

2 ответа

Решение

Я нашел решение.

Мне не нужно использовать OVER(PARTITION BY col_1) потому что это уже в GROUP BY пункт. Таким образом, следующий запрос дает мне правильный ответ:

SELECT col_1, col_2, sum(Value) as sum_value
from myTable GROUP BY col_1, col_2

так как я уже группирую по col_1 а также col_2,

Дэйв, спасибо, я понял идею из твоего поста.

Да, вы можете, но вы должны быть последовательны в отношении уровней группировки. То есть, если ваш запрос является запросом GROUP BY, то в аналитической функции вы можете использовать только столбцы "detail" из "неаналитической" части выбранных вами столбцов. Таким образом, вы можете использовать столбцы GROUP BY или неаналитические агрегаты, как в следующем примере:

select product_id, company, 
sum(members) as No_of_Members, 
sum(sum(members)) over(partition by company) as TotalMembership 
From Product_Membership 
Group by Product_ID, Company

надеюсь, это поможет

SELECT col_1, col_2, sum(Value) over(partition by col_1(also try changing this to "col_2"))) as sum_value
from myTable
GROUP BY col_2,col_1 
Другие вопросы по тегам