T-SQL: номер строки_номер не перезапускается - PullRequest
0 голосов
/ 11 июня 2018

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

SELECT 
    SHIPTO, NAV_PN, WQ_WORKED, CR_TS, ROW_COUNT,
    ROW_NUMBER() OVER (PARTITION BY WQ_WORKED ORDER BY CR_TS) AS ROW_COUNT
FROM 
    #TABLE

Результаты кода против необходимых результатов

1 Ответ

0 голосов
/ 12 июня 2018

Хорошо, основываясь на вашем изображении, вы хотите рассчитывать последовательные значения WQ_WORKED при упорядочении по дате.Для этого сначала необходимо установить критерии группировки (разбиения) таким образом, чтобы нужные значения были правильно подсчитаны.

В этой ситуации вы можете сделать это, используя метод Табибитозан (путешественник) для определениягруппирует внутри вашей серии, сначала создавая row_number для каждой записи в вашем наборе записей, упорядоченной по cr_ts (и, возможно, по другому значению, если требуется прерыватель связи), а затем вычтите из этого row_number с тем же порядком, но разделив по значению, которое выхочу сгруппировать по.

Этот промежуточный идентификатор группы может затем использоваться вместе с исходными значениями раздела для вычисления вашего аналитического результата.В этом случае ваш окончательный row_count.

С предоставленными образцами данных (на основе прилагаемого изображения и расширенных данных из комментария ниже):

Drop Table #TABLE;
with DTA(SHIPTO, NAV_PN, WQ_WORKED, CR_TS) as (
  select 7703556, '1817953C1', 1, cast('6/1/2018' as date) union all
  select 7703556, '1817953C1', 1, cast('6/4/2018' as date) union all
  select 7703556, '1817953C1', 0, cast('6/5/2018' as date) union all
  select 7703556, '1817953C1', 0, cast('6/6/2018' as date) union all
  select 7703556, '1817953C1', 1, cast('6/7/2018' as date) union all
  select 7703556, '1817953C1', 0, cast('6/8/2018' as date) union all
  --Expanded dataset below here
  select 7703047, '1648518C1', 1, cast('6/12/2018' as date) union all --0 1 1
  select 7703047, '1648518C1', 1, cast('6/13/2018' as date) union all --2 4 2
  select 7703047, '2010358C1', 1, cast('6/12/2018' as date) union all --0 2 1
  select 7703047, '2010358C1', 1, cast('6/13/2018' as date) union all --2 3 2
  select 7813059, '1648518C1', 0, cast('6/12/2018' as date) union all --2 1 1
  select 7813059, '1648518C1', 1, cast('6/13/2018' as date) union all --2 2 1
  select 7813059, '2010358C1', 0, cast('6/12/2018' as date) union all --2 2 1
  select 7813059, '2010358C1', 1, cast('6/13/2018' as date)           --2 1 1
)
select SHIPTO, NAV_PN, WQ_WORKED, CR_TS
  into #TABLE
  from dta;

Следующий запрос возвращает ожидаемые результаты (дляисходные данные):

with tabi as (
select dta.*
     , row_number() over (order by cr_ts)
     - row_number() over (partition by wq_worked order by cr_ts) grp
  from #TABLE dta
 where shipto = 7703556
)
select SHIPTO, NAV_PN, WQ_WORKED, CR_TS
     , row_number() over (partition by wq_worked, grp order by cr_ts) ROW_COUNT
  from tabi
 order by cr_ts

Результаты:

SHIPTO  NAV_PN      WQ_WORKED   CR_TS       ROW_COUNT
7703556 1817953C1   1           2018-06-01  1
7703556 1817953C1   1           2018-06-04  2
7703556 1817953C1   0           2018-06-05  1
7703556 1817953C1   0           2018-06-06  2
7703556 1817953C1   1           2018-06-07  1
7703556 1817953C1   0           2018-06-08  1

С расширенным набором данных, приведенным в вашем комментарии ниже, необходимо добавить дополнительные критерии разделения для различных аналитических функций:

with tabi as (
select dta.*
     , row_number() over (partition by SHIPTO, NAV_PN order by cr_ts)
     - row_number() over (partition by SHIPTO, NAV_PN, WQ_WORKED order by cr_ts) grp
  from #TABLE dta
)
select tabi.*
     , row_number() over (partition by SHIPTO, NAV_PN, WQ_WORKED, grp order by cr_ts) ROW_COUNT
  from tabi
 order by SHIPTO, NAV_PN, WQ_WORKED, cr_ts
...