홈>
GROUP BY
를 사용하여 단 하나의 쿼리로 작업을 해결하려고했습니다.
그러나
WITH
를 사용하여 복잡한 솔루션을 얻었습니다.
조항-그래서 2 개의 쿼리가 결합되었습니다. 하지만 과도하게 엔지니어링하는 경향이 있다고 생각합니다.
3 개의 테이블이 있습니다 :
(아래스키마섹션의 테이블 레이아웃에 대한 전체 SQL 참조)
- 저자
- 대상
- 책
예를 들어, 작업을 읽습니다
find authors who have written books on more than 2 subjects
내 연구 중에 나는 복잡하고 과도하게 설계된 2 가지 솔루션을 생각 해냈다 :
솔루션 1-
PARTITION BY
사용
조항은 행 번호를 해결
WITH temp1 AS
(
SELECT author_id, subject_id, ROW_NUMBER () OVER (PARTITION BY author_id) as rn
FROM books
GROUP BY author_id, subject_id
)
SELECT DISTINCT author_id FROM temp1 WHERE rn > 2
;
솔루션 2-
GROUP BY
를 포함하는 2 개의 쿼리 결합
조항
WITH temp1 AS
(
SELECT author_id, subject_id
FROM books
GROUP BY author_id, subject_id
)
SELECT DISTINCT author_id, COUNT(*) FROM temp1
GROUP BY author_id
HAVING COUNT(*) > 2
;
단 하나의 쿼리로 이러한 작업을 해결할 수있는 방법이 있습니까?
<시간> 스키마아래 SQL은 PostgreSQL에 적용됩니다
CREATE SEQUENCE authors_id_seq;
CREATE TABLE authors
(
id bigint NOT NULL DEFAULT nextval('authors_id_seq'::regclass),
name TEXT NOT NULL,
CONSTRAINT pk_authors PRIMARY KEY (id)
);
CREATE SEQUENCE subjects_id_seq;
CREATE TABLE subjects
(
id bigint NOT NULL DEFAULT nextval('subjects_id_seq'::regclass),
name TEXT NOT NULL,
CONSTRAINT pk_subjects PRIMARY KEY (id)
);
CREATE SEQUENCE books_id_seq;
CREATE TABLE books
(
id bigint NOT NULL DEFAULT nextval('books_id_seq'::regclass),
name TEXT NOT NULL,
popularity int NOT NULL,
author_id bigint NOT NULL,
subject_id bigint NOT NULL,
CONSTRAINT pk_books PRIMARY KEY (id),
CONSTRAINT fk_books_authors_author_id FOREIGN KEY (author_id)
REFERENCES authors (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE,
CONSTRAINT fk_books_subjects_subject_id FOREIGN KEY (subject_id)
REFERENCES subjects (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE
);
종자 데이터 :
INSERT INTO authors (name) VALUES
('John Doe'),
('Friedrich Nietzsche');
INSERT INTO subjects (name) VALUES
('anatomy'),
('geography'),
('nature');
INSERT INTO books (name, popularity, author_id, subject_id) VALUES
('body', 5, 1, 1),
('earth', 10, 1, 2),
('ocean', 9, 1, 2),
('animals', 9, 1, 3),
('birds', 7, 2, 3);
- 답변 # 1
관련 자료
- oracle - Group by와 비교하여 SQL에서 Over Partition 사용
- mysql - sql - 2 개의 다른 group by 명령어를 사용하여 2 개의 쿼리를 하나로 결합하는 방법
- mysql - 유사한 필드로 그룹화하는 중첩 된 선택 쿼리
- Flutter의 Firebase 복합 쿼리
- C #에서 복합 그룹
- apache spark - 레코드 그룹에 복잡한 UDF를 적용하면이 문제를 해결하기 위해 UDF가 필요하다고 생각합니다
- oracle - 쿼리 조인 또는 그룹 별 선택
- database performance - 유사한 결과를위한 Oracle PARTITION BY vs GROUP BY 설명
- view - 하단 네비게이션 바의 반응 네이티브 복합 모양
- Spring Data Jpa Repository를 사용하여 복잡한 쿼리를 작성할 수 있습니까?
- google cloud firestore - Firebase 규칙에 의해 수집 그룹 쿼리 거부
- sql server - 조회수를 kafka를 통해 복잡한 쿼리를 ETL에 사용하는 좋은 전략입니까?
- indexing - 'GROUP BY'로 쿼리 속도를 높이려면 어떻게해야합니까?
- javascript - html 캔버스 - 채우기 아크 기반 복잡한 모양
- cassandra - 기본 파티션별로 그룹화
- sql - 조합을 사용하여 다른 그룹과 다른 쿼리를 조인
관련 질문
- 보기를 그룹으로 조작하고 조건을 추가하려는 경우-POSTGRESQL
- Python에서 데이터베이스 채우기 시도-AttributeError : 'tuple'개체에 'keys'속성이 없습니다.
- Postgresql GEOSIntersects 오류를 해결하는 방법은 무엇입니까?
- WITH 및 Ignore 오류를 사용하여 여러 테이블에 Postgresql 삽입
- sql : jsonb_path_query_array 결과를 다른 배열과 비교 (순서 무시)
- sql : Postgres에서 Oracle의 utl_raw.cast_to_raw ()와 동일
- sql : 데이터베이스의 모든 기본 테이블에 대해 모든 열의 데이터 유형을 유니 code 데이터 유형으로 변경하는 방법
- 높은 공간 소비자를 식별하기 위해 db 크기의 분석을 찾는 방법-postgresql
- postgresQL count 시간당 최대 동시 사용자 세션 수
- sql : Postgres 테이블 결합
저자 _ID에 따라 다른 과목 수만 있으면됩니다