符合与过去7天内的情况相同的情况的MS SQL Count情况数

时间:2018-08-28 19:25:38

标签: sql sql-server count conditional-statements

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

对于每个Emp1,计算最近7天的优先级数=当前日期的优先级,以生成最近7天的PriorityCount。大小写只是每一行的唯一标识符。

+------------+------+----------+--------------------------+
|    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 |
+------------+------+----------+--------------------------+

2 个答案:

答案 0 :(得分:0)

您可以尝试交叉应用子查询,该子查询获取相对于当前行日期的最近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 <> t1.case子句中添加WHERE

答案 1 :(得分:0)

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

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
相关问题