ClickHouse 오류 해결: 'ClickHouse Column xxx is not under aggregate function and not in GROUP BY keys'

2024-07-27

ClickHouse Column xxx is not under aggregate function and not in GROUP BY keys 오류 해결 가이드

이 오류는 ClickHouse 쿼리에서 집계 함수 또는 GROUP BY 절에 포함되지 않은 열을 사용하려고 할 때 발생합니다. ClickHouse는 성능을 최적화하기 위해 집계 쿼리에서 사용되는 열을 미리 처리해야 합니다. 따라서 집계 함수 또는 GROUP BY 절에 포함되지 않은 열은 처리되지 않아 오류가 발생합니다.

해결 방법:

  • 열을 집계 함수에 포함: 오류 메시지에 표시된 열을 집계 함수에 포함하십시오. 예를 들어, 오류 메시지가 "ClickHouse Column 'age' is not under aggregate function"이면 다음과 같이 AVG 함수에 포함해야 합니다.
SELECT AVG(age) AS average_age
FROM my_table;
  • 열을 GROUP BY 절에 포함: 오류 메시지에 표시된 열을 GROUP BY 절에 포함하십시오. 예를 들어, 오류 메시지가 "ClickHouse Column 'city' is not in GROUP BY keys"이면 다음과 같이 GROUP BY 절에 포함해야 합니다.
SELECT city, AVG(age) AS average_age
FROM my_table
GROUP BY city;
  • DISTINCT 키워드 사용: 오류 메시지에 표시된 열이 DISTINCT 키워드와 함께 사용되는 경우 해당 열을 GROUP BY 절에 포함하거나 집계 함수에 포함해야 합니다. 예를 들어, 다음 쿼리는 오류를 발생시킵니다.
SELECT DISTINCT city, age
FROM my_table;

이 오류를 해결하려면 다음과 같이 GROUP BY city를 추가해야 합니다.

SELECT DISTINCT city, age
FROM my_table
GROUP BY city;
SELECT CASE WHEN age >= 18 THEN 'adult' ELSE 'minor' END AS age_group, age
FROM my_table;
SELECT CASE WHEN age >= 18 THEN 'adult' ELSE 'minor' END AS age_group, age
FROM my_table
GROUP BY age_group;

참고:

  • ClickHouse 버전 0.21.3부터 DISTINCT 키워드와 함께 사용되는 열은 자동으로 GROUP BY 절에 포함됩니다.



ClickHouse 예제 코드

데이터베이스 및 테이블 만들기:

CREATE DATABASE my_database;

USE my_database;

CREATE TABLE events (
  event_id INT64 PRIMARY KEY,
  timestamp DATETIME,
  user_id INT64,
  event_type STRING
);

데이터 삽입:

INSERT INTO events VALUES
  (1, '2024-07-14 00:00:00', 123, 'login'),
  (2, '2024-07-14 00:05:00', 456, 'purchase'),
  (3, '2024-07-14 00:10:00', 123, 'logout'),
  (4, '2024-07-14 00:15:00', 789, 'signup');
SELECT * FROM events;

특정 사용자의 이벤트 수 계산:

SELECT user_id, COUNT(*) AS event_count
FROM events
GROUP BY user_id;

최근 이벤트 가져오기:

SELECT *
FROM events
ORDER BY timestamp DESC
LIMIT 10;

조인 사용:

CREATE TABLE users (
  user_id INT64 PRIMARY KEY,
  name STRING
);

INSERT INTO users VALUES
  (123, 'John Doe'),
  (456, 'Jane Doe'),
  (789, 'Peter Jones');

SELECT events.event_id, events.timestamp, events.event_type, users.name
FROM events
JOIN users ON events.user_id = users.user_id;

위 코드는 ClickHouse의 기본 기능을 보여주는 몇 가지 예일 뿐입니다. ClickHouse는 다양한 기능을 제공하며 자세한 내용은 공식 문서를 참조하십시오.

추가 자료




  • PostgreSQL: PostgreSQL은 오픈 소스 관계형 데이터베이스로서 다양한 기능과 뛰어난 성능을 제공합니다. ClickHouse보다 복잡한 쿼리 및 트랜잭션 작업에 더 적합합니다.
  • MySQL: MySQL은 또 다른 인기있는 오픈 소스 관계형 데이터베이스입니다. ClickHouse보다 사용하기 쉽고 웹 애플리케이션에 적합합니다.
  • MongoDB: MongoDB는 NoSQL 문서 데이터베이스로서 스키마 없는 데이터를 저장하는 데 유용합니다. ClickHouse보다 유연하고 확장하기 쉬우며 비 구조화 데이터 작업에 적합합니다.
  • Apache Cassandra: Apache Cassandra는 분산된 NoSQL 키-값 데이터베이스로서 대규모 데이터 세트에 적합합니다. ClickHouse보다 높은 확장성과 가용성을 제공하며 대량의 데이터를 처리해야 하는 경우 적합합니다.

aggregate clickhouse

aggregate clickhouse