如何根据某个时间范围汇总

时间:2018-11-13 10:56:12

标签: sql sql-server aggregate-functions

我有一系列输入发票的发票。创建发票时,发票日期之前的所有未发票项目将获得当前发票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

enter image description here

这是预期的结果

enter image description here

1 个答案:

答案 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 <>小提琴。