GROUP BY 쿼리에서 각 그룹의 특정 열에 대해 가장 자주 사용되는 값을 반환하는 방법은 무엇입니까?

Dodecafonico

이 예제 테이블이 있습니다.

  sort_order  product      color    productid   price
  ----------  -------      ------   ---------   -----
      1       bicycle       red      2573257     50
      2       bicycle       red      0983989     40
      3       bicycle       red      2093802     45
      4       bicycle       blue     9283409     55
      5       bicycle       blue     3982734     60
      1       teddy bear    brown    9847598     20
      2       teddy bear    black    3975897     25
      3       teddy bear    white    2983428     30
      4       teddy bear    brown    3984939     35
      5       teddy bear    brown    0923842     30
      1       tricycle      pink     2356235     25
      2       tricycle      blue     2394823     30
      3       tricycle      blue     9338832     35
      4       tricycle      pink     2383939     30
      5       tricycle      blue     3982982     35

제품, 평균 가격 및 가장 빈번한 색상을 반환하는 쿼리를 원합니다.

따라서이 예제의 내 쿼리는 다음을 반환 할 것으로 예상됩니다.

product      most_frequent_color     average_price
-------      -------------------     -------------
bicycle      red                     50
teddy bear   brown                   28
tricycle     blue                    31

평균적인 부분은 제품별로 그룹화하고 평균 (가격)을 사용하는 것만으로도 쉬운 것 같지만 가장 빈번한 색상 부분은 어떻게 해결할 수 있습니까?

이것은 지금까지 내가 알아낼 수있는 쿼리이지만 각 그룹에 대해 most_frequent_color를 얻는 방법을 모르겠습니다.

SELECT product, avg(price) AS average_price from products
WHERE sort_order <= 5
GROUP BY product

내 실제 테이블에는 일반적으로 관심있는 것보다 각 그룹에 대해 더 많은 행이 있으므로 sort_order 필드를 사용하여 제한된 양만 가져옵니다.

"color"에 대한 모든 행에 null이 있거나 가장 자주 사용되는 색상이 둘 이상있는 희귀 그룹의 경우 반환 된 most_frequent_color 열에 null을 반환하고 싶습니다.

이것에 대한 도움을 주셔서 감사합니다!

이사회

SELECT에서 추가 쿼리를 사용 하여 동일한 데이터에 대해 집계 쿼리를 효과적으로 수행 할 수 있습니다 .

SELECT   t.product,
         Avg ( t.price ) AS average_price,
         (
                  SELECT   IF ( Count(*) = t4.count, NULL, t2.color ) 'color'
                  FROM     products t2
                  JOIN
                           (
                                    SELECT   t3.product,
                                             t3.color,
                                             count(*) 'count'
                                    FROM     products t3
                                    GROUP BY t3.product ,
                                             t3.color
                                    ORDER BY count(*) DESC
                           ) t4
                  ON       t2.product = t4.product
                           AND t2.color <> t4.color
                  WHERE    t2.product = t.product
                  GROUP BY t2.color
                  ORDER BY count(*) DESC limit 1
         ) AS most_frequent_color
FROM     products t
WHERE    t.sort_order <= 5
GROUP BY t.product

따라서 products사용 하는 두 번째 사본을 연결하고 product목록 상단에서 가장 자주 발생하는 각 색상의 개수 (해당 제품에 대한)를 선택한 다음 첫 번째 행만 가져옵니다. 따라서 해당 제품의 가장 빈번한 색상 값을 가져옵니다.

이것은 인라인 뷰 ( FROM쿼리 절에 배치됨)와 동일하지 않습니다 .

참고 : 이것은 MySQL에서 작동하지만 데이터베이스에 구애받지 않습니다.

업데이트 : 이제 동일한 빈도로 둘 이상의 색상을 확인하고 null을 반환합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관