Как договориться в определенные сроки - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть последовательность записей, на которые выставлен счет.При создании счета все элементы до даты выставления счета, которые не были выставлены, получат текущий идентификатор счета.

Теперь у меня есть список записей и одна из записей, которые были выставлены.Мне нужен запрос, который назначает правильный invoiceItemId для записей.

Это мои примеры данных

    Create table #InvoiceItems 
(
    ID int,
    SegmentID int,
    Created dateTime,
    [Type] int,
    InvoiceItemID int
)

INSERT INTO #InvoiceItems values (1002330   , 1000322,  '2018-05-29 16:06:31.257',  1,  NULL)
INSERT INTO #InvoiceItems values (1002331   , 1000322,  '2018-05-29 16:06:31.257',  2,  NULL)
INSERT INTO #InvoiceItems values (1002332   , 1000322,  '2018-05-29 16:06:31.257',  3,  NULL)
INSERT INTO #InvoiceItems values (1002333   , 1000322,  '2018-05-29 16:06:31.257',  4,  344)
INSERT INTO #InvoiceItems values (1002334   , 1000322,  '2018-05-29 16:06:31.257',  5,  NULL)
INSERT INTO #InvoiceItems values (1002335   , 1000322,  '2018-05-29 16:06:31.257',  6,  NULL)
INSERT INTO #InvoiceItems values (1002370   , 1000322,  '2018-05-30 15:33:48.453',  2,  NULL)
INSERT INTO #InvoiceItems values (1002371   , 1000322,  '2018-05-30 15:33:48.453',  3,  NULL)
INSERT INTO #InvoiceItems values (1002604   , 1000322,  '2018-06-04 10:25:56.603',  3,  NULL)
INSERT INTO #InvoiceItems values (1002605   , 1000322,  '2018-06-04 10:25:56.603',  4,  344)
INSERT INTO #InvoiceItems values (1002685   , 1000369,  '2018-06-05 10:45:53.570',  1,  NULL)
INSERT INTO #InvoiceItems values (1002686   , 1000369,  '2018-06-05 10:45:53.570',  2,  NULL)
INSERT INTO #InvoiceItems values (1002687   , 1000369,  '2018-06-05 10:45:53.570',  3,  NULL)
INSERT INTO #InvoiceItems values (1002688   , 1000369,  '2018-06-05 10:45:53.570',  4,  274)
INSERT INTO #InvoiceItems values (1002689   , 1000369,  '2018-06-05 10:45:53.570',  5,  NULL)
INSERT INTO #InvoiceItems values (1002690   , 1000369,  '2018-06-05 10:45:53.570',  6,  NULL)
INSERT INTO #InvoiceItems values (1002691   , 1000369,  '2018-06-05 12:26:52.153',  3,  NULL)
INSERT INTO #InvoiceItems values (1002692   , 1000369,  '2018-06-05 12:26:52.153',  4,  275)
INSERT INTO #InvoiceItems values (1002761   , 1000369,  '2018-06-06 11:19:11.613',  2,  NULL)
INSERT INTO #InvoiceItems values (1002762   , 1000369,  '2018-06-06 11:19:11.613',  3,  NULL)
INSERT INTO #InvoiceItems values (1002763   , 1000369,  '2018-06-06 11:19:18.503',  2,  NULL)
INSERT INTO #InvoiceItems values (1002764   , 1000369,  '2018-06-06 11:19:18.503',  3,  NULL)
INSERT INTO #InvoiceItems values (1002765   , 1000369,  '2018-06-06 11:20:10.333',  2,  NULL)
INSERT INTO #InvoiceItems values (1002766   , 1000369,  '2018-06-06 11:20:10.333',  3,  NULL)
INSERT INTO #InvoiceItems values (1002767   , 1000369,  '2018-06-06 11:20:10.333',  4,  276)
INSERT INTO #InvoiceItems values (1002768   , 1000369,  '2018-06-06 11:20:32.677',  2,  NULL)
INSERT INTO #InvoiceItems values (1002769   , 1000369,  '2018-06-06 11:20:32.677',  3,  NULL)

select  * from #InvoiceItems order by SegmentID , Created 

DROP table #InvoiceItems

На рисунке показано, как элементы объединяются.Запись с типом 4 определяет время, когда счет был сгенерирован.Последние 2 элемента (id 1002768, 1002769) не получили счета и не должны получать InnvoiceItemID.Записи с идентификатором 1002333 и 1002605 имеют один и тот же InvoiceItemID, который является более точным случаем.Если это усложняет задачу, пожалуйста, предположите, что у него есть 2 разных InvoiceItemIds

enter image description here

Это ожидаемый результат

enter image description here

1 Ответ

0 голосов
/ 13 ноября 2018

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

Если у вас есть группа, то идентификатор счета-фактуры рассчитывается с помощью оконной функции:

select ii.*, max(InvoiceItemID) over (partition by grp)
from (select ii.*,
             count(InvoiceItemID) over (order by created desc) as grp
      from InvoiceItems ii
     ) ii
order by created;

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

...