【问题标题】:How to select a single record per segment based on priority如何根据优先级为每个段选择一条记录
【发布时间】:2019-07-12 05:23:04
【问题描述】:

我有一个 Activity 列表,在每个段(StartTimeEndTime)中执行。活动具有定义的优先级(TASK = 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');

我在这一点上陷入困​​境,试图弄清楚如何进一步解决这个问题。任何解决方案或建议将不胜感激。干杯。

【问题讨论】:

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


    【解决方案1】:

    我们可以尝试使用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);
    

    Demo

    ROW_NUMBER 在这里通过查找每个用户和时间范围的最高优先级记录来工作。

    【讨论】:

      【解决方案2】:
      select * from (
       select *, ROW_NUMBER()over(partition by UserID,StartTime, EndTime  order by PRIORITY 
       desc)as RNo from ActivityDetails)a
       where RNo=1
      

      【讨论】:

        猜你喜欢
        • 2012-08-08
        • 1970-01-01
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多