我有一系列输入发票的发票。创建发票时,发票日期之前的所有未发票项目将获得当前发票ID。
我现在有了条目列表和已开具发票的条目之一。我需要将正确的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个项目(编号1002768、1002769)未开发票,也不应获得InnvoiceItemID。标识为1002333和1002605的条目具有相同的InvoiceItemID,更多的是边缘情况。如果这使事情变得困难,那么请假定其2个不同的InvoiceItemIds
这是预期的结果
答案 0 :(得分:1)
您可以通过计算时间大于任意给定时间的发票ID的数量来定义具有相同发票ID的组。
一旦有了组,就可以使用窗口函数来计算发票编号:
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;
Here是db <>小提琴。