【问题标题】:MS SQL Count number of cases which satisfy same condition as case in last 7 daysMS SQL 统计过去 7 天内满足相同条件的案例数
【发布时间】:2019-02-03 12:09:10
【问题描述】:

我想在 SQL“PriorityCountInLast7Days”中生成一个列,用于计算优先级与该情况相同的情况的数量。如何在 SQL 中执行此操作?

对于每个 Emp1,计算priorityinthelast7days = priorityatcurrentdate 的数量以生成PriorityCountinLast7days。大小写只是每一行的唯一标识符。

+------------+------+----------+--------------------------+
|    Date    | Emp1 | Priority | PriorityCountinLast7days |
+------------+------+----------+--------------------------+
| 2018-06-01 | A    |        0 |                        0 |
| 2018-06-03 | A    |        0 |                        1 |
| 2018-06-03 | A    |        0 |                        2 |
| 2018-06-03 | A    |        1 |                        1 |
| 2018-06-03 | A    |        2 |                        1 |
| 2018-06-04 | A    |        0 |                        3 |
| 2018-06-01 | B    |        0 |                        1 |
| 2018-06-02 | B    |        0 |                        2 |
| 2018-06-03 | B    |        0 |                        3 |
+------------+------+----------+--------------------------+

【问题讨论】:

  • 从现在开始的最后 7 天还是从当前行中的 datecase 是独一无二的吗?并且还应该计算当前行的情况吗? 'A4''A5' 的行建议是,'A1'``, 'A2'` 和 A3' 的行不建议。
  • @a_horse_with_no_name 已编辑!
  • @stickybbit 是的,每行的大小写应该是唯一的。
  • 好吧,您刚刚编辑了问题并删除了 [Case] 字段,您说该字段唯一标识了该行(如主键)。现在我的回答似乎无关紧要。不知道为什么要删除它,因为现在数据结构甚至不是第一范式。

标签: sql sql-server count conditional-statements


【解决方案1】:

您可以尝试交叉应用一个子查询,该查询从相对于当前行的日期的最后 7 天获取具有相同优先级的同一员工的案例计数。

SELECT t1.date,
       t1.emp1,
       t1.[case],
       t1.priority,
       x.c prioritycountinlast7days
       FROM elbat t1
            CROSS APPLY (SELECT count(*) c
                                FROM elbat t2
                                WHERE t2.emp = t1.emp
                                      AND t2.priority = t1.priority
                                      AND t2.date >= dateadd(day, -7, t1.date)
                                      AND t2.date <= t1.date) x;

我仍然不知道,是否应该计算当前案例。随着更多的样本数据表明是的,我就是这样写的。如果不应该计算,请将AND t2.case &lt;&gt; t1.case 添加到WHERE 子句中。

【讨论】:

    【解决方案2】:

    您可以使用子查询来重新查询表以获取计数。唯一困难的部分是用于应用计数的过滤器。此示例中的输出与您在问题中的预期输出不同,但乍一看,我不确定您是如何根据算法规则确定预期输出的。

    DECLARE @temp TABLE (Date date, Emp1 char(1), [Case] char(2), Priority int)
    INSERT INTO @temp VALUES
     ('2018-06-01', 'A', 'A1', 0) 
    ,('2018-06-03', 'A', 'A2', 0)
    ,('2018-06-03', 'A', 'A3', 0)
    ,('2018-06-03', 'A', 'A4', 1)
    ,('2018-06-03', 'A', 'A5', 2)
    ,('2018-06-04', 'A', 'A6', 0)
    ,('2018-06-01', 'B', 'B1', 0)
    ,('2018-06-02', 'B', 'B2', 0)
    ,('2018-06-03', 'B', 'B3', 0) 
    
    SELECT * 
          ,(SELECT COUNT(*)
              FROM @temp T2
             WHERE T2.Emp1 = T1.Emp1
               AND T2.[Date] <= DATEADD(DAY, 7, T1.[Date])
               AND T2.Priority = T1.Priority
               AND T2.[Case] < T1.[Case]
    
           ) AS [PriorityCountinLast7days]
      FROM @temp T1
    

    产生输出:

    Date        Emp1    Case    Priority    PriorityCountinLast7days
    ----------------------------------------------------------------
    2018-06-01  A       A1      0           0
    2018-06-03  A       A2      0           1
    2018-06-03  A       A3      0           2
    2018-06-03  A       A4      1           0
    2018-06-03  A       A5      2           0
    2018-06-04  A       A6      0           3
    2018-06-01  B       B1      0           0
    2018-06-02  B       B2      0           1
    2018-06-03  B       B3      0           2
    

    【讨论】:

      猜你喜欢
      • 2020-08-27
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多