如何根据优先级为每个段选择单个记录

时间:2019-07-12 05:23:04

标签: sql sql-server tsql sql-server-2016

我有一个在每个段期间操作的活动列表(开始时间结束时间)。活动具有已定义的优先级(任务= 7,CHAT = 10),其中10最高。

+--------+------------------+------------------+----------+----------+
| UserID |     StartTime    |      EndTime     | ACTIVITY | PRIORITY |
+--------+------------------+------------------+----------+----------+
|  ABCD  | 2019/07/01 09:00 | 2019/07/01 09:15 |   TASK   |     7    |
+--------+------------------+------------------+----------+----------+
|  ABCD  | 2019/07/01 09:15 | 2019/07/01 09:45 |   TASK   |     7    |
+--------+------------------+------------------+----------+----------+
|  ABCD  | 2019/07/01 09:15 | 2019/07/01 09:45 |   CHAT   |    10    |
+--------+------------------+------------------+----------+----------+
|  ABCD  | 2019/07/01 09:45 | 2019/07/01 10:00 |   TASK   |     7    |
+--------+------------------+------------------+----------+----------+

我需要为每个用户的每个细分关联一个活动。也就是说,对于段09:15-09:45中的用户ABCD,当前有2个活动(TASK和CHAT)。根据优先级,应该将CHAT分配到此细分。

一天中会有多个用户可以在不同时间开始/结束活动,而解决方案需要考虑到这一点。

预期产量

+--------+------------------+------------------+----------+----------+
| UserID |     StartTime    |      EndTime     | ACTIVITY | PRIORITY |
+--------+------------------+------------------+----------+----------+
|  ABCD  | 2019/07/01 09:00 | 2019/07/01 09:15 |   TASK   |     7    |
+--------+------------------+------------------+----------+----------+
|  ABCD  | 2019/07/01 09:15 | 2019/07/01 09:45 |   CHAT   |    10    |
+--------+------------------+------------------+----------+----------+
|  ABCD  | 2019/07/01 09:45 | 2019/07/01 10:00 |   TASK   |     7    |
+--------+------------------+------------------+----------+----------+

场景数据

DECLARE @ActivityLog TABLE (UserID VARCHAR(20), Activity VARCHAR(8), Priority INT, StartTime DATETIME, EndTime DATETIME)

INSERT INTO @ActivityLog VALUES ('ABCD', 'TASK', 7, '2019/07/01 09:00', '2019/07/01 09:15');
INSERT INTO @ActivityLog VALUES ('ABCD', 'TASK', 7, '2019/07/01 09:15', '2019/07/01 09:45');
INSERT INTO @ActivityLog VALUES ('ABCD', 'CHAT', 10, '2019/07/01 09:15', '2019/07/01 09:45');
INSERT INTO @ActivityLog VALUES ('ABCD', 'TASK', 7, '2019/07/01 09:45', '2019/07/01 10:00');

在这一点上,我一直试图找出如何进一步解决该问题的方法。任何解决方案或建议将不胜感激。干杯。

2 个答案:

答案 0 :(得分:2)

使用ROW_NUMBERTOP 1 WITH TIES可以尝试:

SELECT TOP 1 WITH TIES UserID, StartTime, EndTime, ACTIVITY, PRIORITY
FROM @ActivityLog
ORDER BY ROW_NUMBER() OVER (PARTITION BY UserID, StartTime, EndTime ORDER BY PRIORITY DESC);

enter image description here

Demo

ROW_NUMBER在这里的工作方式是为每个用户和时间范围找到最高优先级的记录。

答案 1 :(得分:0)

select * from (
 select *, ROW_NUMBER()over(partition by UserID,StartTime, EndTime  order by PRIORITY 
 desc)as RNo from ActivityDetails)a
 where RNo=1