我想在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 |
+------------+------+----------+--------------------------+
答案 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