选择多个分组依据的前1名

时间:2018-10-15 17:26:33

标签: sql sql-server

我在SQL Server 2016中有一张表(我相信它最初是从2008或2012开始的,它刚刚移到了2016群集中),其中包含患者事件,事件类型和事件的严重性(称为年级)。在某些情况下,同一位患者会发生多个事件,但等级不同。因此,数据样本将如下所示:

| Pt_id | Event          | Grade |
+-------+----------------+-------+
| 01    | Pain           | 2     |
| 01    | Pain           | 4     |
| 01    | Nausea         | 2     |
| 02    | Headache       | 2     |
| 02    | Headache       | 3     |
| 03    | Blurred Vision | 3     |
| 03    | Blurred Vision | 4     |
| 03    | Bluured Vision | 3     |
| 03    | Nausea         | 4     |
| 03    | Nausea         | 2     |

我正在努力使每位患者的每项不同事件的评分最高。我对该数据的期望输出如下:

| Pt_id | Event          | Grade |
+-------+----------------+-------+
| 01    | Pain           | 4     |
| 01    | Nausea         | 2     |
| 02    | Headache       | 3     |
| 03    | Blurred Vision | 4     |
| 03    | Nausea         | 4     |

我尝试使用合并到查询中的前1名,ROW_Number,分区以及Google向我抛出的所有其他信息,但是结果太受限制(我大约有30行,但实际上通过Excel(我想在这里进行一些质量检查),我应该有不到400行。我认为,当我执行这些功能时,我缺少了一些东西,它将所有Pt_ids分组并且仅为所有针对该Pt_id的事件或事件与事件有关的事件-无论我如何尝试,都不会给我每个事件每个病人一行,并且该事件和病人的评分最高。

尽管我已经使用SQL多年了,但是它从来都不是我的主要功能,因此非常感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

GROUP BYMAX()一起使用还不够吗?

SELECT Pt_id, Event, MAX(Grade)
FROM table t
GROUP BY Pt_id, Event;

如果表中除了3列以外还有更多的列,请在ROW_NUMBER()子句中使用TIES

SELECT TOP (1) WITH TIES t.*
FROM table t
ORDER BY ROW_NUMBER() OVER (PARTITION BY Pt_id, Event ORDER BY Grade DESC);

答案 1 :(得分:0)

使用row_number窗口功能

   with cte as
    (
    select *,
    row_number() over(partition by Pt_id ,Event by order by Grade desc) rn 
    from your_table
    )select * from cte where rn=1

您必须使用order by Grade desc来获取最大值