基于sql

时间:2016-12-22 09:40:34

标签: sql sql-server

我有这样的结果

TimeDiffMin | OrdersCount
10          |  2
12          |  5
09          |  6
20          | 15
27          | 11

我想要以下

TimeDiffMin | OrdersCount
05          |  0
10          |  8
15          |  5
20          | 15
25          |  0
30          | 11

因此,您可以看到我希望每5分钟进行一次分组,并在5分钟内显示总订单数。例如。 0-5分钟0个订单,5-10分钟8个订单

任何帮助将不胜感激。

当前查询:

 SELECT TimeDifferenceInMinutes, count(OrderId) NumberOfOrders  FROM (
 SELECT AO.OrderID, AO.OrderDate, AON.CreatedDate AS CancelledDate,     DATEDIFF(minute, AO.OrderDate, AON.CreatedDate) AS TimeDifferenceInMinutes 
FROM 
(SELECT OrderID, OrderDate FROM AC_Orders) AO
JOIN
(SELECT OrderID, CreatedDate FROM AC_OrderNotes WHERE Comment LIKE '%has been cancelled.') AON 
ON AO.OrderID = AON.OrderID
 WHERE DATEDIFF(minute, AO.OrderDate, AON.CreatedDate) <= 100  AND AO.OrderDate >= '2016-12-01'
  ) AS Temp1
 GROUP BY TimeDifferenceInMinutes

2 个答案:

答案 0 :(得分:2)

现在,如果您对TVF开放。

我使用此UDF创建动态日期/时间范围。您提供范围和增量

Declare @YourTable table  (TimeDiffMin int,OrdersCount int)
Insert Into @YourTable values
(10, 2),
(12, 5),
(09, 6),
(20,15),
(27,11)


Select TimeDiffMin = cast(R2 as int)
      ,OrdersCount = isnull(sum(OrdersCount),0)
From (Select R1=RetVal,R2=RetVal+5 From [dbo].[udf-Range-Number](0,25,5)) A
Left Join (
            -- Your Complicated Query
            Select * From @YourTable
          ) B on TimeDiffMin >= R1 and TimeDiffMin<R2
 Group By R1,R2
 Order By 1

返回

TimeDiffMin OrdersCount
5           0
10          6
15          7
20          0
25          15
30          11

UDF如有兴趣

CREATE FUNCTION [dbo].[udf-Range-Number] (@R1 money,@R2 money,@Incr money)
Returns Table
Return (
    with cte0(M) As (Select cast((@R2-@R1)/@Incr as int)),
         cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
         cte2(N) As (Select Top (Select M from cte0) Row_Number() over (Order By (Select NULL)) From cte1 a,cte1 b,cte1 c,cte1 d,cte1 e,cte1 f,cte1 g,cte1 h )

    Select RetSeq=1,RetVal=@R1 Union All Select N+1,(N*@Incr)+@R1
    From   cte2   
)
-- Max 100 million observations 
-- Select * from [dbo].[udf-Range-Number](0,4,0.25)

答案 1 :(得分:1)

您可以使用派生表来首先构建时差窗口,然后从中加入以汇总该窗口内的所有Orders

declare @t table(TimeDiffMin int
                ,OrdersCount int
                );
insert into @t values
 (10, 2)
,(12, 5)
,(09, 6)
,(20,15)
,(27,11);

declare @Increment int = 5;    -- Set your desired time windows here.

with n(n)
as
(  -- Select 10 rows to start with:
  select n from(values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as n(n)
),n2 as
(  -- CROSS APPLY these 10 rows to get 10*10=100 rows we can use to generate incrementing ROW_NUMBERs.  Use more CROSS APPLYs to get more rows:
  select (row_number() over (order by (select 1))-1) * @Increment as StartMin
        ,(row_number() over (order by (select 1))) * @Increment as EndMin
  from n                -- 10 rows
    cross apply n n2    -- 100 rows
    --cross apply n n3  -- 1000 rows
    --cross apply n n4  -- 10000 rows
)
select m.EndMin as TimeDiffMin
      ,isnull(sum(t.OrdersCount),0) as OrdersCount
from n2 as m
  left join @t t
    on(t.TimeDiffMin >= m.StartMin
       and t.TimeDiffMin < m.EndMin
       )
where m.EndMin <= 30    --  Filter as required
group by m.EndMin
order by m.EndMin

查询结果:

TimeDiffMin OrdersCount
5           0
10          6
15          7
20          0
25          15
30          11