2013-03-12 473 views
4

我有一个简单的查询。在sql中查找最常见的值并按从高到低排序(asc)

select id, patient_id, diagnosis from dbo.diabetes_rx_tracker 

group by id, patient_id, diagnosis 

最常见的诊断代码需要出现在列表的顶部并带有一个计数。

我试过使用计数功能。

但它将每个患者的所有值都作为1返回,而不是添加。

select id, patient_id, count(diagnosis) from dbo.diabetes_rx_tracker 

group by id, patient_id, diagnosis 

我在编辑我的group by语句时也一直抛出错误。

任何帮助将不胜感激。谢谢。

+0

最常见的诊断代码是每个'患者'每个'id'?或最常见的诊断代码?每个ID – Lamak 2013-03-12 18:37:25

+0

是我正在寻找,抱歉,不详细。 – Supplement 2013-03-12 18:39:33

+0

你使用的是什么RDBMS(SQL Server,Oracle,Postgres,MySQL)和版本?此外,您需要通过常见诊断排序的所有行,或者仅需要id和patient_id? – Lamak 2013-03-12 18:41:49

回答

8

这看起来像你没有足够的聚合。 GROUP by中的每个字段代表与其他字段进行汇总的字段。所以这只会告诉你通过身份证,病人,诊断的诊断。不是很有帮助。

为了获得最常见的诊断期间,从分组中删除ID和patient_id还有:

select 
    count(diagnosis) 
from dbo.diabetes_rx_tracker 
group by 
    diagnosis 
order by 
    count(diagnosis) desc 

要获得所有IDS最常见的代码,从分组中删除patient_id选择:

select 
    diagnosis, 
    id, 
    count(1) as CodeCount 
from dbo.diabetes_rx_tracker 
group by 
    diagnosis, 
    id 
order by 
    count(diagnosis) desc 

更新:根据您的新标准,这是你想要的。

select 
    id, 
    diagnosis, 
    ct 
from (
    select 
     row_number() OVER (PARTITION BY id ORDER BY count(diagnosis) desc) as rn, 
     count(diagnosis) as ct, 
     diagnosis, 
     id 
    from dbo.diabetes_rx_tracker 
    group by 
     id, 
     diagnosis 
    ) ranked 
where 
    rn = 1 
order by 
    CT desc 
+0

你的第一个选择似乎是我想要的,但我没有看到身份证和患者ID附加到计数..第二个答案给我所有的标准,但CodeCount是1。 – Supplement 2013-03-12 18:46:28

+0

您还想要患者ID吗?那么您想要查看所有患有该ID最常见诊断代码的患者吗? – 2013-03-12 18:49:03

+0

是的,这是正确的...所有患者ID都有最常见的dia代码和与该代码有关的计数。 – Supplement 2013-03-12 18:50:41