Есть ли оконная функция или комбинация оконных функций, которые я могу использовать для получения желаемого результата через TSQL? - PullRequest
0 голосов
/ 25 мая 2020

Возьмите, например, приведенную ниже таблицу:

ORDER_KEY  |   STATUS_DATE   | TASK_CREATED_DATE |  TASK_KEY  | TASK_ROW_ID | TASK_REVISION_ID 
-----------|-----------------|-------------------|------------|-------------|------------------ 
1274796898 | 10/4/2019 18:19 | 10/4/2019 18:12   | 5277852673 |           1 |                  
1274796898 | 10/4/2019 18:19 | 10/4/2019 18:12   | 5277852674 |           2 |                  
1274796898 | 10/4/2019 18:19 | 4/7/2020 14:22    | 5277853673 |           3 |                1 
1274796898 | 10/4/2019 18:19 | 4/7/2020 14:22    | 5277853674 |           4 |                1 
1274796898 | 10/4/2019 18:19 | 4/7/2020 14:22    | 5277853675 |           5 |                1 
1274737653 | 10/4/2019 15:32 | 10/4/2019 15:31   | 5277852586 |           1 |                  
1274737653 | 10/4/2019 15:32 | 10/4/2019 15:31   | 5277852587 |           2 |                  
1274737653 | 10/4/2019 15:32 | 10/4/2019 15:31   | 5277852588 |           3 |                  
1274737653 | 10/4/2019 15:32 | 10/4/2019 15:32   | 5277852589 |           4 |                  
1274737647 | 10/4/2019 11:49 | 10/4/2019 11:42   | 5277855586 |           1 |                  
1274737647 | 10/4/2019 11:49 | 10/4/2019 11:42   | 5277855587 |           2 |                  
1274737647 | 10/4/2019 11:49 | 10/4/2019 11:42   | 5277855588 |           3 |                  
1274737647 | 10/4/2019 11:49 | 10/4/2019 11:42   | 5277855589 |           4 |                  
1274737647 | 10/4/2019 11:49 | 10/4/2019 11:42   | 5277855590 |           5 |                  
1274737647 | 10/4/2019 11:49 | 10/4/2019 11:49   | 5277855587 |           6 |                  
1274737647 | 10/4/2019 11:49 | 10/4/2019 11:49   | 5277856270 |           7 |                  
1274737647 | 10/4/2019 11:49 | 4/7/2020 14:10    | 5281403575 |           8 |                1 
1274737647 | 10/4/2019 11:49 | 4/7/2020 14:10    | 5281403576 |           9 |                1 
1274737647 | 10/4/2019 11:49 | 4/7/2020 14:12    | 5281403595 |          10 |                1 
1274737647 | 10/4/2019 11:49 | 4/14/2020 09:32   | 5281403599 |          11 |                2 
1274737647 | 10/4/2019 11:49 | 4/26/2020 13:10   | 5281403600 |          12 |                3 

, которую можно воспроизвести с помощью следующего запроса:

with data as (
    select *
    from (
      values
      (1274796898, '10/4/2019 18:19', '10/4/2019 18:12', 5277852673,   1), 
      (1274796898, '10/4/2019 18:19', '10/4/2019 18:12', 5277852674,   2), 
      (1274796898, '10/4/2019 18:19', '4/7/2020 14:22', 5277853673,   3), 
      (1274796898, '10/4/2019 18:19', '4/7/2020 14:22', 5277853674,   4), 
      (1274796898, '10/4/2019 18:19', '4/7/2020 14:22', 5277853675,   5), 
      (1274737653, '10/4/2019 15:32', '10/4/2019 15:31', 5277852586,   1), 
      (1274737653, '10/4/2019 15:32', '10/4/2019 15:31', 5277852587,   2), 
      (1274737653, '10/4/2019 15:32', '10/4/2019 15:31', 5277852588,   3), 
      (1274737653, '10/4/2019 15:32', '10/4/2019 15:32', 5277852589,   4), 
      (1274737647, '10/4/2019 11:49', '10/4/2019 11:42', 5277855586,   1), 
      (1274737647, '10/4/2019 11:49', '10/4/2019 11:42', 5277855587,   2), 
      (1274737647, '10/4/2019 11:49', '10/4/2019 11:42', 5277855588,   3), 
      (1274737647, '10/4/2019 11:49', '10/4/2019 11:42', 5277855589,   4), 
      (1274737647, '10/4/2019 11:49', '10/4/2019 11:42', 5277855590,   5), 
      (1274737647, '10/4/2019 11:49', '10/4/2019 11:49', 5277855587,   6), 
      (1274737647, '10/4/2019 11:49', '10/4/2019 11:49', 5277856270,   7), 
      (1274737647, '10/4/2019 11:49', '4/7/2020 14:10', 5281403575,   8), 
      (1274737647, '10/4/2019 11:49', '4/7/2020 14:10', 5281403576,   9), 
      (1274737647, '10/4/2019 11:49', '4/7/2020 14:12', 5281403595,  10), 
      (1274737647, '10/4/2019 11:49', '4/14/2020 09:32', 5281403599,  11), 
      (1274737647, '10/4/2019 11:49', '4/26/2020 13:10', 5281403600,  12)
    ) v (ORDER_KEY, STATUS_DATE, TASK_CREATED_DATE, TASK_KEY, TASK_ROW_ID)
)
select * from data;

Поведение, которого я в конечном итоге хочу достичь, - это TASK_REVISION_ID вывод столбца .
В приведенных выше данных он был введен вручную в целях иллюстрации.

TASK_ROW_ID = ROW_NUMBER() OVER(PARTITION BY ORDER_KEY ORDER BY TASK_CREATED_DATE, TASK_KEY)

На уровне ORDER_KEY я хочу увеличить TASK_REVISION_ID следующим образом:

  1. Установить TASK_REVISION_ID на 1, когда TASK_CREATED_DATE> STATUS_DATE
  2. Приращение TASK_REVISION_ID, если разница в минутах между текущей строкой TASK_CREATED_DATE и предыдущая строка TASK_CREATED_DATE> = 5

Ответы [ 2 ]

3 голосов
/ 25 мая 2020

Это ответ на исходную версию вопроса.

То, что вы описываете, фиксируется этим запросом:

select (case when grp = 1
             then sum(case when prev_tcd > dateadd(minute, -5, TASK_CREATED_DATE) then 0 else 1 end) over
                      (partition by d.order_key, v.grp order by task_created_date)
        end),
       d.*
from (select d.*,
             lag(TASK_CREATED_DATE) over (partition by order_key order by TASK_CREATED_DATE) as prev_tcd
      from data d
     ) d cross apply
     (values ((case when task_created_date > status_date then 1 else 0 end))) v(grp)
order by 1, 2, 3;

Здесь - это скрипт db <> .

1 голос
/ 27 мая 2020

Вам нужно только изменить исходный ответ , который хоть немного показывает правильную идею:

select
  d.ORDER_KEY, d.STATUS_DATE, d.TASK_CREATED_DATE, d.TASK_KEY, d.TASK_ROW_ID, 
  task_revision_id = (
    case when grp = 1
    then sum(case when datediff(mi, prev_tcd, TASK_CREATED_DATE) > 5 or grp_first = 1 then 1 else 0 end) over
                      (partition by d.order_key, d.grp order by task_row_id)
    end
  )
from
  (select d.*,
          lag(TASK_CREATED_DATE) over (partition by order_key order by task_row_id) as prev_tcd,
          case when task_created_date > status_date then 1 else 0 end as grp,
          case when lag(case when task_created_date > status_date then 1 else 0 end, 1, 0) over (partition by order_key order by task_row_id) = 0 then 1 else 0 end as grp_first
   from
      data d
  ) d 
order by
  order_key,
  task_row_id
...