我在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多年了,但是它从来都不是我的主要功能,因此非常感谢您的帮助!
答案 0 :(得分:5)
将GROUP BY
与MAX()
一起使用还不够吗?
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
来获取最大值