2016-11-15 68 views
-1

在列中找到大量答案以找到列中最常見的值,但我想要做的是在第1列中按第2列中的最常見值標識組,只要找到共同的價值本身:where子句中的最常見值

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

我要查找其最常見的SicknessReason是「咳嗽」所有EmployeeIDs,例如,所以在這個例子,我想回到EmployeeIDs 1和3

編輯:在現實世界中,有更多的列需要相同的方法,即最常見的SicknessReason ='咳嗽'和最常見的ReportingMethod ='短信'等。

回答

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

感謝 - 在我的現實世界中的表我有需要的同等待遇,即我要找到獨特EmployeeIDs,其最常見的SicknessReason是「咳嗽」,其更大量列最常見的ReportingMethod是'短信',..和...將這種技術應用於多列的最佳方式是什麼? – gh0st

+1

在問題中增加了這樣的要求,他們會隱藏/隱藏在諸如 –

+0

@ gh0st的評論中。 。 。詢問*另一個*問題。這個問題非常清楚,涉及到一列。 –

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