我有一个在每个段期间操作的活动列表(开始时间,结束时间)。活动具有已定义的优先级(任务= 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');
在这一点上,我一直试图找出如何进一步解决该问题的方法。任何解决方案或建议将不胜感激。干杯。
答案 0 :(得分:2)
使用ROW_NUMBER
和TOP 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);
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