code

그룹화 기준 및 주문 기준

starcafe 2023. 8. 6. 10:13
반응형

그룹화 기준 및 주문 기준

GROUP BY 절은 행을 그룹화하지만 결과를 특정 순서로 정렬할 필요는 없습니다.순서를 변경하려면 GROUP BY 절 뒤에 있는 ORDER BY 절을 사용합니다.ORDER BY 절에 사용된 열은 ORDER BY의 일반적인 사용법과 달리 SELECT 목록에 표시되어야 합니다. [Order BY의 오라클, 4번째 에디션, 274페이지]

왜 그런 것일까요?GROUP BY를 사용하면 SELECT 절의 필수 열에 영향을 미치는 이유는 무엇입니까?

또한 GROUP BY를 사용하지 않는 경우: 일부 열만 주문하고 일부 열만 선택하는 이유는 무엇입니까?

사실 Dave Costa의 예가 보여주듯이 그 진술은 완전히 사실이 아닙니다.

오라클 문서에는 식을 사용할 수 있지만 선택 목록의 열을 기반으로 해야 한다고 나와 있습니다.

expr - expr에 대한 값을 기준으로 행을 내보냅니다.식은 선택 목록의 열 또는 테이블, 뷰 또는 FROM 절의 구체화된 뷰의 열을 기반으로 합니다.출처:Oracle® Database SQL Language Reference 11g Release 2 (11.2) E26088-01 2011년 9월19-33페이지

동일한 작업에서 19-13페이지와 19-33페이지(PDF 1355페이지 및 1365페이지

enter image description here

enter image description here

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#SQLRF01702

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#i2171079

인용문의 굵은 글씨 텍스트가 올바르지 않습니다(대부분의 일반적인 사용 사례에서 해당되는 지나치게 단순화된 것일 수도 있지만 요구 사항으로는 엄격하게 해당되지는 않습니다).를 들어, 이 잘 되지만, 예들어잘실, 은문지만되행이장,AVG(val)선택 목록에 없습니다.

WITH DATA AS (SELECT mod(LEVEL,3) grp, LEVEL val FROM dual CONNECT BY LEVEL < 100)
SELECT grp,MIN(val),MAX(val)
FROM DATA
GROUP BY grp
ORDER BY AVG(val)

ORDER BY 절의 식은 GROUP BY의 맥락에서 평가할 수 있어야 합니다.를 들면 예를들어들.ORDER BY val에서는 의위에예왜작않지것을다입니, 면표현이식하냐하동라는 않을 입니다.val그룹화를 통해 생성된 각 행에 대해 고유한 값이 없습니다.

두 번째 질문과 관련하여, 주문 표현식의 값이 아니라 주문에 관심이 있을 수 있습니다.선택 목록에서 불필요한 식을 제외하면 서버에서 클라이언트로 실제로 보내야 하는 데이터 양이 줄어듭니다.

첫 번째:

그룹화 기준의 구현은 절(테이블 뷰 또는 일부 조인된 테이블)과 구조가 다른 새 결과 집합을 만드는 것입니다.이 결과 집합은 선택한 항목에 의해 정의됩니다.

에 이러한 것은 , 되지 않은열의 ("SQL RDBMS", "" "" " " " " " 모든정만지것항니은아다합함에야는니되여집의수열않계상렬그해은의지룹되화은는것있에이한러이한제▁of▁not▁▁an▁(▁aggregate합다니▁▁by▁be야▁require함▁restrict여▁is▁it▁this▁though▁whation수,집▁rment▁ordereded▁that▁the▁r에▁a▁is▁always계▁columns열▁every▁sql,않것항▁sql은-▁hasgroup든는의상은되해렬정의AVG,SUM그룹화 작업의 결과에 대한 논리적 요구 사항이기 때문에 (예: 두 개의 열 추가)에 의해 그룹화된 열 중 하나 또는 둘 이상의 결과에 따라 기능합니다.

두 번째:

왜냐하면 당신은 주문에 대해 그 열에만 관심이 있기 때문입니다.예를 들어, 매출을 제공하지 않고 상위 판매 싱글 목록이 있을 수 있습니다(NYT 베스트셀러는 데이터의 일부 세부 정보는 비밀로 유지하지만 순위가 매겨진 목록은 있음).물론 이 열을 선택한 다음 사용하지 않으면 이 문제를 해결할 수 있습니다.

데이터는 주문 기준으로 정렬되기 전에 집계됩니다.

다른 열(목록 또는 집계 함수에 의해 그룹에 포함되지 않음)을 기준으로 정렬하려고 하면 어떤 값이 사용됩니까?주문에 사용할 단일 값이 없습니다.

나는 당신이 정렬을 위해 값들의 조합을 사용할 수 있다고 생각합니다.그래서 이렇게 말할 수 있습니다.

order by a+b

만약 a와 b가 그룹에 속한다면 다음과 b.SELECT에 언급되지 않은 열은 도입할 수 없습니다.그러나 SELECT에 언급되지 않은 집계 기능을 사용할 수 있다고 생각합니다.

샘플표

sample.grades
Name   Grade    Score
Adam   A        95
Bob    A        97
Charlie C       75

GROUP BY를 사용한 첫 번째 쿼리

Select grade, count(Grade) from sample.grades GROUP BY Grade

산출량

Grade Count
A     2
C     1

순서를 사용한 두 번째 쿼리

select Name, score from sample grades order by score

산출량

Bob    A        97
Adam   A        95
Charlie C       75

GROUP BY 및 오더를 사용한 세 번째 쿼리

Select grade, count(Grade) from sample.grades GROUP BY Grade desc

산출량

Grade Count
A     2
C     1

일단 카운트와 같은 것을 사용하기 시작하면 그룹화 기준이 있어야 합니다.함께 사용할 수는 있지만 사용법이 매우 다릅니다. 예를 통해 분명히 알 수 있기를 바랍니다.

질문에 답하기 위해 그룹화는 선택 섹션의 항목에 영향을 줍니다. 그룹화는 그룹화를 의미하기 때문입니다.열을 기준으로 그룹화하지 않으면 열 개수를 계산할 수 없습니다.

두 번째 질문, 모든 열을 선택하지 않고 주문하려는 이유는 무엇입니까?점수를 기준으로 주문하고 싶지만 실제 점수나 심지어 내가 할 수 있는 점수에 대해서도 신경 쓰지 않는 경우

select name from sample.grades order by score

산출량

Name
Bob
Adam
Charlie

선택 목록에 나열되지 않은 열 및 절별 그룹에 참여하지 않은 열별 순서가 표시될 것으로 예상되는 결과는 무엇입니까?어떤 경우에도 SELECT 목록 열에 언급되지 않은 모든 종류의 정렬은 생략되므로 Oracle 사용자는 이 제한을 올바르게 추가했습니다.

with c as (
select 1 id, 2 value from dual
union all
select 1 id, 3 value from dual
union all
select 2 id, 3 value from dual
)
select id
from c
group by id
order by count(*) desc

내가 이해한 바로는

"GROUP BY 절은 행을 그룹화하지만 반드시 특정 순서로 결과를 정렬하지는 않습니다."

-> 그룹화 기준을 순서 없이 사용할 수 있습니다.

"순서를 변경하려면 GROUP BY 절 뒤에 있는 ORDER BY 절을 사용합니다."

-> 행은 기본 키를 사용하여 기본적으로 선택되며, 기준 순서를 추가할 경우 다음 기준으로 그룹을 추가해야 합니다.

"ORDER BY 절에 사용된 열은 SELECT 목록에 나타나야 합니다. 이는 ORDER BY 절을 일반적으로 사용하는 것과 다릅니다."

언급URL : https://stackoverflow.com/questions/12184566/group-by-combined-with-order-by

반응형