select retl_a
from vpp_fpp
group by dpci_lbl_t
qualify rank() over (order by count(*) desc) = 1;
귀하의 초기 쿼리는 "비 집계 값"오류를 반환합니다. MAX (retla_a)와 같은 것을하거나 GROUP BY 절로 옮길 수 있습니다.
모드를 얻으려면 먼저 (dpci_lbl_t, retl_a) 콤보 당 행 수를 얻어야합니다.
SELECT dpci_lbl_t, retl_a, COUNT(*) Count_per_pair
FROM vpp_fpp
GROUP BY 1, 2;
그런 다음 당신은 당신이 가장 높은 발생 빈도와 쌍을 얻을 자격을 추가해야합니다 : 당신은 (이전의 대답과 유사) 이런 식으로 뭔가를 시도 할 수 있습니다. 이런 식으로 뭔가 :
SELECT dpci_lbl_t, retl_a, COUNT(*) Count_per_pair
FROM vpp_fpp
GROUP BY 1, 2
QUALIFY RANK() OVER(PARTITION BY dpci_lbl_t ORDER BY Count_per_pair) = 1;
넥타이의 경우를 처리하려면 ... 다른 SELECT 주위에 그 포장 그냥 하위 선택의 "retl_a"모드 값의 평균 수행 할 수 있습니다
SELECT dpci_lbl_t, AVERAGE(retl_a) AS MyMode
FROM (
SELECT dpci_lbl_t, retl_a, COUNT(*) Count_per_pair
FROM vpp_fpp
GROUP BY 1, 2
QUALIFY RANK() OVER(PARTITION BY dpci_lbl_t ORDER BY Count_per_pair) = 1
) src
GROUP BY 1, 2;
을
집계 (즉, MAX/COUNT ... GROUP BY)와 HAVING 절은 창 함수 (예 : RANK(), ROW_NUMBER()) 및 QUALIFY 절보다 먼저 처리됩니다.
요약하면 : 기능 BY
- 카운트/그룹은 (dpci_lbl_t, retl_a) 조합 당 행의 수를 얻을. 이것은 "dpci_lbl_t"그룹당 각 "retl_a"값의 빈도를 나타냅니다.
- 그런 다음 RANK() 함수는 결과 행을 "dpci_lbl_t"로 분할하고 "Count_per_pair"값으로 정렬 한 다음 해당 값을 기반으로 순위를 지정합니다.
- 그런 다음 QUALIFY는 결과를 필터링하여 RANK() = 1 인 행만 반환합니다.이 함수를 창 함수의 WHERE 절로 생각하십시오.
- 외부 SELECT의 AVERAGE()는 모든 관계의 평균을 포함하여 "모드"값을 반환합니다.
TD 시스템에 액세스 할 권한이 없지만 작동하려면 시도해보고 알려주십시오.
실제로 - 제공된 솔루션이 제대로 작동 할 수 있다고 생각합니다. 각 dpci_lbl_t 내의 다양한 값의 retl_a가있는 레코드를 얻을 수 있다면 잘 작동합니다. 그런 다음 retl_a를 최대 카운트 값으로 식별하는 쿼리를 수행 할 수 있습니다. 그러나 나는 그것을 어떻게 통합 할 것인지 생각하려고 노력하고있다. – Zach
Gordon의 코드는 예상대로 작동하지만 동일한 최대 개수의 행이 반환됩니다.하나의 (임의의) 행을 얻으려면'ROW_NUMBER'로 전환하거나 다른 컬럼을 파티션 바이에 추가하거나 'dpci_lbl_t, AVG (retl_a) FROM Gordon 's query'를 실행하여 묶인 값의 평균값을 얻으십시오 (* mode *에 대한 이상한 해석입니다. – dnoeth