Сброс и приращение при изменении значений столбца - PullRequest
0 голосов
/ 25 февраля 2019

Надеюсь, кто-нибудь может помочь.Я использую SQL Server 2008, и уровень совместимости равен 100, и поэтому я не могу использовать функцию опережения / отставания.

Я пытаюсь добиться создания sub_task_id на основе изменений в TRAN_IDи ВЗАИМОДЕЙСТВИЕ.Все данные сортируются по Tran_ID, Task_ID и Interaction_DateTime

Каждая SUB_TASK будет начинаться с 1 для каждого нового TRAN_ID и будет оставаться неизменной до тех пор, пока не будет подробно описано новое взаимодействие «Open», где оно будет увеличиваться на 1.

Я предварительно заполнил SUB_TASK результатом, который я ищу.Не уверен, с чего начать, любая помощь будет оценена.

-------------------------------------------------------------------------
TRAN_ID | TASK_ID | INTERACTION | INTERACTION_DATETIME    | SUB_TASK_ID
-------------------------------------------------------------------------
1234    | 1       | Open        | 2018-01-04 18:02:18     | 1
1234    | 1       | Close       | 2018-01-04 18:02:27     | 1
2234    | 11      | Open        | 2018-01-03 09:04:33     | 1
2234    | 11      | Close       | 2018-01-03 09:04:50     | 1
2234    | 11      | Open        | 2018-01-04 09:05:29     | 2
2234    | 11      | Edit        | 2018-01-04 09:06:42     | 2
2234    | 11      | Edit        | 2018-01-04 09:07:33     | 2
2234    | 11      | Merge       | 2018-01-04 09:09:21     | 2
2234    | 11      | Close       | 2018-01-04 09:13:50     | 2
2234    | 11      | Open        | 2018-01-05 11:14:34     | 3
2234    | 11      | Edit        | 2018-01-05 11:16:49     | 3
2234    | 11      | Edit        | 2018-01-05 11:21:21     | 3
2234    | 11      | Merge       | 2018-01-05 11:55:33     | 3
2234    | 11      | Close       | 2018-01-05 11:56:12     | 3
3242    | 13      | Open        | 2018-01-03 15:47:22     | 1
3242    | 13      | Close       | 2018-01-03 15:47:59     | 1
3242    | 13      | Open        | 2018-01-19 09:38:09     | 2
3242    | 13      | Edit        | 2018-01-19 09:39:10     | 2
3242    | 13      | Edit        | 2018-01-19 09:42:12     | 2
3242    | 13      | Close       | 2018-01-19 09:46:12     | 2

1 Ответ

0 голосов
/ 27 февраля 2019

Вот вариант для вас.

По существу, промежуточный итог на основе TRAN_ID, продиктованный INTERACTION = 'Open', поскольку вы указали: "Каждый SUB_TASK будет начинаться с 1 для каждого нового TRAN_ID и остаетсято же самое, пока не будет подробно описано новое взаимодействие "Открыть", где оно будет увеличиваться на 1 "

Проблема в том, что накопительные суммы не поддерживаются до SQL Server 2012+, поэтому нам придется использовать внешнее применение:

Пример временной таблицы с данными:

CREATE TABLE #TestData 
    (
        [TRAN_ID] INT
      , [TASK_ID] INT
      , [INTERACTION] NVARCHAR(10)
      , [INTERACTION_DATETIME] DATETIME
    );
INSERT INTO #TestData (
                          [TRAN_ID]
                        , [TASK_ID]
                        , [INTERACTION]
                        , [INTERACTION_DATETIME]
                      )
VALUES ( 1234, 1, 'Open', '2018-01-04 18:02:18' )
     , ( 1234, 1, 'Close', '2018-01-04 18:02:27' )
     , ( 2234, 11, 'Open', '2018-01-03 09:04:33' )
     , ( 2234, 11, 'Close', '2018-01-03 09:04:50' )
     , ( 2234, 11, 'Open', '2018-01-04 09:05:29' )
     , ( 2234, 11, 'Edit', '2018-01-04 09:06:42' )
     , ( 2234, 11, 'Edit', '2018-01-04 09:07:33' )
     , ( 2234, 11, 'Merge', '2018-01-04 09:09:21' )
     , ( 2234, 11, 'Close', '2018-01-04 09:13:50' )
     , ( 2234, 11, 'Open', '2018-01-05 11:14:34' )
     , ( 2234, 11, 'Edit', '2018-01-05 11:16:49' )
     , ( 2234, 11, 'Edit', '2018-01-05 11:21:21' )
     , ( 2234, 11, 'Merge', '2018-01-05 11:55:33' )
     , ( 2234, 11, 'Close', '2018-01-05 11:56:12' )
     , ( 3242, 13, 'Open', '2018-01-03 15:47:22' )
     , ( 3242, 13, 'Close', '2018-01-03 15:47:59' )
     , ( 3242, 13, 'Open', '2018-01-19 09:38:09' )
     , ( 3242, 13, 'Edit', '2018-01-19 09:39:10' )
     , ( 3242, 13, 'Edit', '2018-01-19 09:42:12' )
     , ( 3242, 13, 'Close', '2018-01-19 09:46:12' );

Тогда мы можем использовать внешнее применение.Мы будем суммировать, основываясь на ВЗАИМОДЕЙСТВИИ, равном «Открытому» или нет для TASK_ID, где значение INTERACTION_DATETIME меньше или равно.Это должно работать в 2008 году:

SELECT      *
FROM        [#TestData] [a]
OUTER APPLY (
                SELECT SUM(   CASE WHEN [b].[INTERACTION] = 'Open' THEN 1
                                   ELSE 0
                              END
                          ) AS [SUB_TASK_ID]
                FROM   [#TestData] [b]
                WHERE  [b].[TRAN_ID] = [a].[TRAN_ID]
                       AND [b].[INTERACTION_DATETIME] <= [a].[INTERACTION_DATETIME]
            ) [s]
ORDER BY [a].[TRAN_ID], [a].[INTERACTION_DATETIME]

Дать вам желаемые результаты:

TRAN_ID     TASK_ID     INTERACTION INTERACTION_DATETIME    SUB_TASK_ID
----------- ----------- ----------- ----------------------- -----------
1234        1           Open        2018-01-04 18:02:18.000 1
1234        1           Close       2018-01-04 18:02:27.000 1
2234        11          Open        2018-01-03 09:04:33.000 1
2234        11          Close       2018-01-03 09:04:50.000 1
2234        11          Open        2018-01-04 09:05:29.000 2
2234        11          Edit        2018-01-04 09:06:42.000 2
2234        11          Edit        2018-01-04 09:07:33.000 2
2234        11          Merge       2018-01-04 09:09:21.000 2
2234        11          Close       2018-01-04 09:13:50.000 2
2234        11          Open        2018-01-05 11:14:34.000 3
2234        11          Edit        2018-01-05 11:16:49.000 3
2234        11          Edit        2018-01-05 11:21:21.000 3
2234        11          Merge       2018-01-05 11:55:33.000 3
2234        11          Close       2018-01-05 11:56:12.000 3
3242        13          Open        2018-01-03 15:47:22.000 1
3242        13          Close       2018-01-03 15:47:59.000 1
3242        13          Open        2018-01-19 09:38:09.000 2
3242        13          Edit        2018-01-19 09:39:10.000 2
3242        13          Edit        2018-01-19 09:42:12.000 2
3242        13          Close       2018-01-19 09:46:12.000 2

В 2012+ вы можете делать все это с помощью оконной функции.Вот как это выглядело бы, чтобы у вас было это.Немного чище и проще:

SELECT   *
       , SUM(   CASE WHEN [INTERACTION] = 'Open' THEN 1
                     ELSE 0
                END
            ) OVER ( PARTITION BY [TRAN_ID]
                     ORDER BY [TRAN_ID]
                            , [INTERACTION_DATETIME]
                   ) AS [SUB_TASK_ID]
FROM     [#TestData]
ORDER BY [TRAN_ID]
       , [TASK_ID]
       , [INTERACTION_DATETIME];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...