MS SQL Количество дел, удовлетворяющих тем же условиям, что и дело, за последние 7 дней - PullRequest
0 голосов
/ 28 августа 2018

Я хотел бы создать столбец в 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 |
+------------+------+----------+--------------------------+

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Вы можете использовать подзапрос, чтобы повторно запросить таблицу для подсчета. Единственная сложная часть - это фильтры, используемые для подсчета. Вывод в этом примере отличается от вашего ожидаемого результата в вопросе, но на первый взгляд я не уверен, как вы определили ожидаемый результат, учитывая правила алгоритма.

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
0 голосов
/ 28 августа 2018

Вы можете попытаться перекрестно применить подзапрос, который получает количество дел для одного и того же сотрудника с тем же приоритетом за последние семь дней относительно дня текущей строки.

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.

...