각 열에 대해 가장 일반적인 값을 가져옵니다.
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
'source' 카테고리의 다른 글
INSERT SELECT와 함께 재귀 CTE를 사용하여 Maria와 함께 테이블 데이터 생성DB (0) | 2022.10.14 |
---|---|
데몬 프로세스로 php 스크립트 실행 (0) | 2022.10.14 |
Galera 클러스터는 노드 중 하나를 정기적으로 비동기화하고 재동기화합니다. (0) | 2022.10.14 |
외부 키 드롭 방법 (0) | 2022.10.14 |
Java UUID.random을 얻을 수 있는 기회는 얼마나 됩니까?UUID 충돌? (0) | 2022.10.14 |