2017-11-13 21 views
1

Teradata에서 그룹별로 모드를 계산하려고합니다. 다음은 무엇을 권장하고있다된다Teradata를 사용한 모드 계산

select retl_a 
from vpp_fpp 
group by dpci_lbl_t 
qualify rank() over (order by count(*) desc) = 1; 

하지만 선정 된 비 집계 값이 연관된 그룹의 일부 여야 말하는 오류가 발생합니다. 어떤 도움을 주셔서 감사합니다.

data vpp_fpp 
dpci_lbl_t retl_a 
a 4 
a 4 
a 3 
b 3 
b 1 
Expected result: 
a 4 
b 2 
+0

실제로 - 제공된 솔루션이 제대로 작동 할 수 있다고 생각합니다. 각 dpci_lbl_t 내의 다양한 값의 retl_a가있는 레코드를 얻을 수 있다면 잘 작동합니다. 그런 다음 retl_a를 최대 카운트 값으로 식별하는 쿼리를 수행 할 수 있습니다. 그러나 나는 그것을 어떻게 통합 할 것인지 생각하려고 노력하고있다. – Zach

+1

Gordon의 코드는 예상대로 작동하지만 동일한 최대 개수의 행이 반환됩니다.하나의 (임의의) 행을 얻으려면'ROW_NUMBER'로 전환하거나 다른 컬럼을 파티션 바이에 추가하거나 'dpci_lbl_t, AVG (retl_a) FROM Gordon 's query'를 실행하여 묶인 값의 평균값을 얻으십시오 (* mode *에 대한 이상한 해석입니다. – dnoeth

답변

0

당신은 단지 partition by이 필요합니다 아래

은 예입니다. 나는 이것이 당신이 원하는 로직 생각 : 당신은 그냥 아무 집계 계산을하지 않고 값 "retl_a"를 반환하기 때문에

select dpci_lbl_t, retl_a 
from vpp_fpp 
group by dpci_lbl_t, retl_a 
qualify rank() over (partition by dpci_lbl_t order by count(*) desc) = 1; 
+0

코드는 잘 실행되지만 dpci_lbl_t의 각 카테고리에 대한 모드는 제공하지 않습니다. 예를 들어, 특정 dpci_lbl_t에 대해 retl_a 내에 5 개의 다른 값이 있다고 가정하면, 쿼리는 모드 5 또는 5에서 가장 자주 발생하는 값을 반환해야합니다. 쿼리는 현재 dpci_lbl_t의 다른 값에 대해 여러 개의 응답을 반환합니다. 동점이 있으면 내가 볼 수있는 유일한 합병증. 예를 들어, retl_a의 5 가지 값을 사용하면 두 개가 $ 4, 두 개가 $ 5, 한 개가 $ 6이 될 수 있습니다. 그렇다면 $ 4 & $ 5 두 개의 답을 줄 것이거나 간단히 평균을 취할 것입니다. – Zach

+0

원래 샘플에 샘플 데이터와 원하는 결과를 추가해야합니다. – Andrew

+0

감사합니다. 내 원래 게시물 Andrew에 제안을 추가했습니다. 감사. – Zach

0
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

  1. 카운트/그룹은 (dpci_lbl_t, retl_a) 조합 당 행의 수를 얻을. 이것은 "dpci_lbl_t"그룹당 각 "retl_a"값의 빈도를 나타냅니다.
  2. 그런 다음 RANK() 함수는 결과 행을 "dpci_lbl_t"로 분할하고 "Count_per_pair"값으로 정렬 한 다음 해당 값을 기반으로 순위를 지정합니다.
  3. 그런 다음 QUALIFY는 결과를 필터링하여 RANK() = 1 인 행만 반환합니다.이 함수를 창 함수의 WHERE 절로 생각하십시오.
  4. 외부 SELECT의 AVERAGE()는 모든 관계의 평균을 포함하여 "모드"값을 반환합니다.

TD 시스템에 액세스 할 권한이 없지만 작동하려면 시도해보고 알려주십시오.