2016-11-15 11 views
-1

列内で最も一般的な値を見つけるための答えはたくさんありますが、列2の最も一般的な値で列1のグループを識別します。ただ、共通の価値そのものを見つける:where句の最も一般的な値

EmployeeID | SicknessReason 
--------------------------- 
1   | Cough 
1   | Cough 
1   | Cold 
2   | Flu 
2   | Flu 
2   | Cough 
3   | Cough 
3   | Cough 
3   | Cough 

この例では、私はEmployeeIDs 1と3

を返すようにしたいので、私は、その最も一般的なSicknessReasonは、例えば「咳」であるすべてのEmployeeIDsを見つけたいです編集:実際の世界では、同じアプローチ、すなわち最も一般的なSicknessReason = 'Cough'と最も一般的なReportingMethod = 'SMS'などを必要とする列が増えています。

答えて

3

これは、最も一般的な理由(統計学的に「モード」)を計算するだけのわずかな変化である:

select employeeId 
from (select employeeId, sicknessreason, count(*) as cnt 
      dense_rank() over (partition by employeeId order by count(*) desc) as seqnum 
     from t 
     group by employeeId, sicknessreason 
    ) es 
where seqnum = 1 and sicknessreason = 'Cough'; 

注理由にフィルタリングは外部クエリで発生するので、それが影響しないことdense_rank()

+0

感謝 - 私の本当の世界のテーブルに私はその最も一般的なSicknessReasonユニークEmployeeIDsを見つけたい同じ処理、すなわちを必要とするより多くの列を持っているが「咳」ANDそのです最も一般的なReportingMethodは 'sms'で、このテクニックを複数の列に適用する最も良い方法は何ですか? – gh0st

+1

このような要件を質問に追加すると、そのようなコメントに隠れて/埋め込まれます。 –

+0

@ gh0st。 。 。 *別の質問をしてください。この質問はかなり明確で、1つの列を参照しています。 –

0

あなたの例では、各行を一意にするものがありません。私はあなたの例を取っ​​て、自動番号列(図示せず)で表にロードして、各項目を一意にしました。

SELECT EmployeeID, Reason, Occurence = Count(*) 
    FROM Test 
    GROUP BY Reason, EmployeeID 
    ORDER BY Count(*) DESC 

結果:

EmployeeID Reason Occurrence 
    3   Cough  3 
    1   Cough  2 
    2   Flu   2 
    1   Cold  1 
    2   Cough  1 
関連する問題