source

각 열에 대해 가장 일반적인 값을 가져옵니다.

manysource 2022. 10. 14. 22:12

각 열에 대해 가장 일반적인 값을 가져옵니다.

SQL 쿼리를 만들고 있습니다.total_cost테이블 내의 모든 행에 대해.이와 함께, 두 가지 모두에 대한 가장 지배적인 값도 수집해야 합니다.columnA그리고.columnB, 각각의 가치관과 함께.

예를 들어, 다음과 같은 표 내용이 있습니다.

비용. 열 A 열 B 타깃
250 푸우 막대 XYZ
200 푸우 막대 XYZ
150 막대 막대 ABC
250 푸우 막대 ABC

결과는 다음과 같습니다.

합계_비용 열 A_지배적 열B_지배적 열 A_값 열B_값
850 푸우 막대 250 400

이제 총 비용 계산까지 할 수 있습니다. 문제 없습니다.또한 가장 지배적인 값도 얻을 수 있습니다.columnA답을 사용하여.하지만 이 이후로는 어떻게 하면 더 나은 값을 얻을 수 있을지 모르겠어요columnB 가치관도 있습니다.

이것이 현재 SQL입니다.

SELECT 
    SUM(`cost`) AS `total_cost`,
    COUNT(`columnA`) AS `columnA_dominant` 
FROM `table`
GROUP BY `columnA_dominant`
ORDER BY `columnA_dominant` DESC
WHERE `target` = "ABC"

업데이트: 서브쿼리를 사용하는 아이디어에 대한 @Barmar 덕분에 주요 값을 얻을 수 있었습니다.columnA그리고.columnB:

SELECT 
    -- Retrieve total cost.
    SUM(`cost`) AS `total_cost`,
    -- Get dominant values.
    (
        SELECT `columnA`
        FROM `table`
        GROUP BY `columnA`
        ORDER BY COUNT(*) DESC
        LIMIT 1
    ) AS `columnA_dominant`,
    (
        SELECT `columnB`
        FROM `table`
        GROUP BY `columnB`
        ORDER BY COUNT(*) DESC
        LIMIT 1
    ) AS `columnB_dominant`
FROM `table`
WHERE `target` = "XYZ"

하지만 각각의 값을 어떻게 계산해야 할지 아직 고민하고 있습니다.

근접할 수 있습니다. 백분율 값을 얻으려면 추가해 볼 수 있습니다.COUNT(*)최대 카운트를 얻기 위한 서브쿼리에서columnA그리고.columnB그리고 나서 전체로 나눕니다.count

SELECT 
    SUM(cost),
    (
        SELECT tt.columnA
        FROM T tt
        GROUP BY tt.columnA
        ORDER BY COUNT(*) DESC
        LIMIT 1
    )  AS columnA_dominant,
    (
        SELECT tt.columnB
        FROM T tt
        GROUP BY tt.columnB
        ORDER BY COUNT(*) DESC
        LIMIT 1
    )  AS columnB_dominant,
    (
        SELECT COUNT(*)
        FROM T tt
        GROUP BY tt.columnA
        ORDER BY COUNT(*) DESC
        LIMIT 1
    ) / COUNT(*) AS columnA_percentage,
    (
        SELECT COUNT(*)
        FROM T tt
        GROUP BY tt.columnB
        ORDER BY COUNT(*) DESC
        LIMIT 1
    ) / COUNT(*) AS columnB_percentage
FROM T t1

MySQL 버전이 창 기능을 지원하는 경우 테이블 스캔을 줄이는 다른 방법이 관련 하위 쿼리보다 더 나은 성능을 얻을 수 있습니다.

SELECT SUM(cost) OVER(),
       FIRST_VALUE(columnA) OVER (ORDER BY counter1 DESC) columnA_dominant,
       FIRST_VALUE(columnB) OVER (ORDER BY counter2 DESC) columnB_dominant,
       FIRST_VALUE(counter1) OVER (ORDER BY counter1 DESC) / COUNT(*) OVER() columnA_percentage,
       FIRST_VALUE(counter2) OVER (ORDER BY counter2 DESC) / COUNT(*) OVER() columnB_percentage
FROM (
  SELECT *,
         COUNT(*) OVER (PARTITION BY columnA) counter1,
         COUNT(*) OVER (PARTITION BY columnB) counter2  
  FROM T
) t1
LIMIT 1

스컬피들

이 쿼리를 실행해 보세요.

select sum(cost) as total_cost,p.columnA,q.columnB,p.columnA_percentage,q.columnB_percentage
from get_common,(
select top 1 columnA,columnA_percentage
from(
select columnA,count(columnA) as count_columnA,cast(count(columnA) as float)/(select count(columnA) from get_common) as columnA_percentage
from get_common
group by columnA)s
order by count_columnA desc
)p,
(select top 1 columnB,columnB_percentage
from (
select columnB,count(columnB) as count_columnB, cast(count(columnB) as float)/(select count(columnB) from get_common) as columnB_percentage
from get_common
group by columnB) t
order by count_columnB desc)q
group by p.columnA,q.columnB,p.columnA_percentage,q.columnB_percentage

따라서 비율과 지배적인 값을 얻으려면 다음과 같은 자체 쿼리를 만들어야 합니다.

select top 1 columnA,columnA_percentage
from(
select columnA,count(columnA) as count_columnA,cast(count(columnA) as float)/(select count(columnA) from get_common) as columnA_percentage
from get_common
group by columnA)s
order by count_columnA desc

그런 다음 sum 쿼리에 참여하여 원하는 모든 값을 얻을 수 있습니다.

이것이 너에게 도움이 되기를 바란다.

언급URL : https://stackoverflow.com/questions/72223227/get-the-most-common-value-for-each-column