Не можете использовать 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