programing

SQL에서 GROUP BY/집약 기능의 혼란

madecode 2023. 2. 22. 23:23
반응형

SQL에서 GROUP BY/집약 기능의 혼란

알기 쉬운 질문이지만 SQL에서 약간 혼란스러운 점이 있습니다.

이 SQL 쿼리는 Oracle에서 'GROUP BY 식 아님' 오류를 발생시킵니다.왜 그런지 알 수 있습니다.태플 속성으로 그룹화하면 다른 Atribute에 접근할 수 없게 됩니다.

SELECT * 
FROM order_details 
GROUP BY order_no

하지만 이것은 효과가 있다.

SELECT SUM(order_price)
FROM order_details
GROUP BY order_no

이것에 대한 이해를 확실히 하기 위해서…각 주문에 대해 order_details에 여러 개의 tuples가 있다고 가정하면 일단 order_no에 따라 tuples를 그룹화하면 그룹 내 각 개별 tuples의 order_price 속성에 액세스할 수 있지만 집약함수만 사용할 수 있습니까?

즉, SELECT 절에서 사용되는 집약 함수는 그룹으로 드릴다운하여 '숨김' 속성을 확인할 수 있습니다. 여기서 단순히 'SELECT order_no'를 사용하면 오류가 발생합니까?

표준 SQL(MySQL 제외)에서는 GROUP BY를 사용할 때 GROUP BY 절에 집계되지 않은 결과 열을 모두 나열해야 합니다.그래서 만약에order_details6개의 열이 있는 경우 6개의 열을 모두 나열해야 합니다(이름별 - 사용할 수 없음).*GROUP BY 절 또는 ORDER BY 절)을 참조하십시오.

다음 작업도 가능합니다.

SELECT order_no, SUM(order_price)
  FROM order_details
 GROUP BY order_no;

모든 비집약 열이 GROUP BY 절에 나열되므로 이 방법은 작동합니다.

다음과 같은 작업을 수행할 수 있습니다.

SELECT order_no, order_price, MAX(order_item)
  FROM order_details
 GROUP BY order_no, order_price;

이 쿼리는 별로 의미가 없지만(또는 대부분의 경우 의미가 없을 수 있음) '작동'합니다.개별 주문 번호와 주문 가격 조합을 나열하고 해당 가격과 관련된 최대 주문 항목(번호)을 제공합니다.주문에 포함된 모든 품목의 가격이 다르면 각각 한 줄로 이루어진 그룹이 됩니다.OTOH, 같은 가격(각 £0.99 등)의 상품이 여러 개 있을 경우, 그것들을 그룹화하여 그 가격으로 최대 주문품 번호를 반환합니다.(테이블에 프라이머리 키가 켜져 있을 것 같습니다.(order_no, order_item)주문의 첫 번째 항목은order_item = 1, 두 번째 항목은 2 등입니다.)

SQL을 쓰는 순서가 실행되는 순서와 다릅니다.

일반적으로 SQL은 다음과 같이 씁니다.

SELECT
FROM
JOIN
WHERE
GROUP BY
HAVING
ORDER BY

SQL은 다음과 같이 실행됩니다.

FROM
JOIN
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

을 에 SELECTGROUP BY는 프로그래밍에서의 하향식 동작입니다.아직 신고하지 않은 것을 호출할 수 없습니다.

상세내용 : https://sqlbolt.com/lesson/select_queries_order_of_execution

SELECT * 
FROM order_details 
GROUP BY order_no

위의 쿼리에서 모든 열을 선택하는 이유는 다음과 같은 방법으로 그룹화되지 않은 오류를 발생시키기 때문입니다.select 스테이트먼트에서 모든 컬럼을 언급할 필요가 없도록 하려면 모든 컬럼이 절별로 그룹화되어야 합니다.

 SELECT * 
    FROM order_details 
    GROUP BY order_no,order_details,etc

etc는 order_table의 모든 열을 의미합니다.

절별 그룹화를 사용하려면 select 스테이트먼트에서 절별 그룹화까지 모든 열을 언급해야 합니다.집약 함수의 열은 언급하지 마십시오.

이를 수행하려면 partition by 절 대신 partition by 절을 사용하여 파티션으로 그룹화할 수 있습니다.

1까지 파티션으로 만들 수도 있습니다.

이 문제를 방지하려면 Common Table Expression(CTE)을 사용합니다.

여러 개의 CT도 편리하고, 내가 사용한 케이스를 붙인다...아마도 도움이 될 것이다.

with ranked_cte1 as  
( select r.mov_id,DENSE_RANK() over ( order by r.rev_stars desc )as rankked from ratings r  ),

ranked_cte2 as  ( select * from movie where mov_id=(select mov_id from ranked_cte1 where rankked=7 ) )  select * from ranked_cte2

 select * from movie where mov_id=902

언급URL : https://stackoverflow.com/questions/4611897/group-by-aggregate-function-confusion-in-sql

반응형