T SQL Столбец запроса, который является истинным, если условие выполняется в «цепочке» строк - PullRequest
0 голосов
/ 11 января 2020

Это продолжение от этого вопроса . Это будет сложно.

У меня есть таблица, подобная следующей, для отслеживания начала и конца инцидентов определенного типа c:

+----------+-------------+------------------+------------------+
| PersonID | Weapon Used |     StartDate    |     EndDate      |
+----------+-------------|------------------+------------------+
|      006 | Knife       | 2019-12-01 09:30 | 2019-12-02 06:15 |
|      007 | Grenade     | 2019-12-01 12:15 | 2019-12-01 12:16 |
|      006 | Bat         | 2019-12-02 06:15 | 2019-12-02 15:15 |
|      006 | Pistol      | 2019-12-02 15:15 | 2019-12-02 23:01 |
|      007 | Pistol      | 2019-12-02 07:23 | 2019-12-04 08:30 |
+----------+-------------+------------------+------------------+

Я пытаюсь создайте вычисляемый столбец, который возвращает значение ИСТИНА при следующих условиях:

  • Событие строки является частью «цепочки» событий от 1 до 2.
  • AND Пистолет используется в цепочке событий 1+ раз.
  • AND Событие строки имеет самую раннюю StartDate в цепочке.

Создание такой таблицы:

+----------+-------------+------------------+------------------+---------+
| PersonID | Weapon Used |     StartDate    |     EndDate      | Pistol+ |
+----------+-------------|------------------+------------------+---------+
|      006 | Knife       | 2019-12-01 09:30 | 2019-12-02 06:15 | TRUE    |
|      007 | Grenade     | 2019-12-01 12:15 | 2019-12-01 12:16 | FALSE   |
|      006 | Bat         | 2019-12-02 06:15 | 2019-12-02 15:15 | FALSE   |
|      006 | Pistol      | 2019-12-02 15:15 | 2019-12-02 23:01 | FALSE   |
|      007 | Pistol      | 2019-12-02 07:23 | 2019-12-04 08:30 | TRUE    |
+----------+-------------+------------------+------------------+---------+

По общему признанию, это высокий заказ, но я должен сделать это для большого количества строк, поэтому я отчаянно пытаюсь Избегайте необходимости вычислять его вручную и глазным яблоком. Это возможно?

1 Ответ

0 голосов
/ 11 января 2020

Вам потребуется recursive cte, чтобы найти grp связанных последовательных строк

seq, чтобы идентифицировать первый из group

для идентификации если группа содержит pistol, она использует оконную функцию sum() с условной case

with
cte as
(
    select  *, rn = row_number() over (partition by PersonID order by StartDate)
    from    yourtable
),
rcte as
(
    select  c.PersonID, c.[Weapon Used], c.StartDate, c.EndDate, c.rn, 
            grp = 1, seq = 1
    from    cte c
    where   rn  = 1

    union all

    select  c.PersonID, c.[Weapon Used], c.StartDate, c.EndDate, c.rn,
            grp   = case    when    r.EndDate = c.StartDate
                            then    r.grp
                            else    r.grp + 1
                            end,
            seq   = case    when    r.EndDate = c.StartDate
                            then    r.seq + 1
                            else    1
                            end
    from    cte c
            inner join rcte r   on  c.PersonID  = r.PersonID
                               and  c.rn        = r.rn + 1
)
select  *,
        case    when    seq = 1
                and     sum(case when [Weapon Used] = 'Pistol' then 1 else 0 end) 
                        over (partition by PersonID, grp) >= 1
                then    'TRUE'
                else    'FALSE'
                end
from    rcte;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...