>source

이름이있는 다음 테이블이 있습니다.t2:

 realm   |    race    | gender | total  
----------+------------+--------+--------
 Buffalo  | faerie     | F      |   5972
 Buffalo  | faerie     | M      |   2428
 Buffalo  | footballer | F      |   1954
 Buffalo  | footballer | M      |   2093
 Buffalo  | raccoon    | F      |   2118
 Buffalo  | raccoon    | M      |   1237
 Buffalo  | shark      | F      |  12497
 Buffalo  | shark      | M      |   3621
 Buffalo  | wizard     | F      |    468
 Buffalo  | wizard     | M      |  11079
 Camelot  | faerie     | F      |   2414
 Camelot  | faerie     | M      |   1455

합계가 가장 높은 영역, 인종 및 성별 만 선택하는 쿼리를 만들고 싶습니다. 내가 사용할 때마다 GROUP BY 나는 두 성별을 계속 얻습니다.

출력 테이블은 다음과 같습니다.

 realm   |    race    | gender | total  
----------+------------+--------+--------
 Buffalo  | faerie     | F      |   5972
 Buffalo  | footballer | M      |   2093
 Buffalo  | raccoon    | F      |   2118
...

행을 비교하는 방법에 대한 이해가 매우 부족하다고 생각합니다.
어떻게 쓰는지 모르겠어요 WHERE 절 그래서 내가 GROUP BY realm,race,gender , 나는 단지 1 개의 성별을 얻습니다.

이것은 표 1을 얻기 위해 작성한 쿼리입니다.

SELECT t2.realm, t2.race, t2.gender, MAX(t2.total) as total
FROM (
   SELECT t1.realm, t1.race, t1.gender, sum(t1.sql) as total
   FROM (
      SELECT l.realm, a.race, a.gender, l.treasure,t.sql
      FROM loot l
      JOIN visit v ON l.login = v.login AND l.realm = v.realm AND l.day = v.day 
      JOIN avatar a ON a.login = l.login AND a.name = v.name 
      JOIN treasure t ON t.treasure = l.treasure Order by a.race, a.gender, l.realm
      ) as t1
   GROUP BY t1.realm, t1.race, t1.gender
   ORDER BY t1.realm,t1.race
   ) as t2
GROUP BY t2.realm, t2.race, t2.gender;

  • 답변 # 1

    완벽한 사용 사례 DISTINCT ON :

    SELECT DISTINCT ON (realm, race) *
    FROM   tbl
    ORDER  BY realm, race, total DESC;
    
    

    db<>여기에 바이올린

    특히 쿼리에는 GROUP BY 조금도.
    합계가 NOT NULL , 그렇지 않으면 추가 NULLS LAST .
    동점 일 경우 추가하지 않는 한 승자는 임의로 결정됩니다. ORDER BY 넥타이를 끊는 항목.

    상해:

    각 GROUP BY 그룹에서 첫 번째 행을 선택 하시겠습니까?

  • 답변 # 2

    select q.realm
    , q.race
    , q.gender
    , q.total
    from (
        Select t2.realm
        , t2.race
        , t2.gender
        , total
        , max(total) over (partition by t2.realm, t2.race) as maxtotal
        FROM adventure t2
    ) q
    where q.total = q.maxtotal
    
    

관련 자료

  • 이전 python - Django REST 프레임 워크 API 루트 비어 있음
  • 다음 python - docker django 데이터베이스 연결 오류 - 유니 코드 ascii 'utf-8'및 유니 코드 'utf-16le'인코딩 사용