如何在SQL Server中显示基于每分钟频率的数据集

时间:2018-01-08 18:43:29

标签: sql sql-server

我有一张表,其中包含订单详情,例如,如果12345订单发布于08-01-2018 00:02并在08-01-2018 00:06完成,那么我希望结果集扩展为分钟到下面的东西。我们怎么能这样做SQL Server,基本上想要从开始分钟(00:02)到结束分钟(00:06)的每分钟结果中有一个单独的行,请建议,它应该是通用的,适用于所有其他原始数据

原始表:

OrderNo Order_received      Order_Completes
-------------------------------------------
12345   08-01-2018 00:02:00 08-01-2018 00:06:00

期望的结果集

OrderNo. time                Order_received order_complete 
------------------------------------------------------------
12345    08-01-2018 00:02     1               0   
12345    08-01-2018 00:03     1               0   
12345    08-01-2018 00:04     1               0   
12345    08-01-2018 00:05     1               0   
12345    08-01-2018 00:06     0               1   

4 个答案:

答案 0 :(得分:1)

这是一个创建日期/时间列表的函数:

Create Function [dbo].[DateTimeTbl](@BeginDate DateTime, @EndDate DateTime)
RETURNS @retDate TABLE 
(
    Dt DateTime
)
BEGIN

    While @BeginDate <= @EndDate
    Begin

        Insert Into @retDate (Dt) Values (@BeginDate);
        Set @BeginDate = DateAdd("MINUTE", 1, @BeginDate);
    End


    RETURN;
END;

和用法:

SELECT * FROM DBO.[DateTimeTbl]('12/01/2015 12:01:00 AM', '12/01/2015 12:05:00 AM')

您可以在结果中加入此

答案 1 :(得分:0)

我会使用递归CTE,这也适用于具有null完整值的“open”订单:

DECLARE @myData TABLE (OrderNo INT, Order_Received DATETIME, Order_Completes DATETIME)
INSERT INTO @myData (OrderNo, Order_Received, Order_Completes)
VALUES (12345,'2018-01-08 00:02:00','2018-01-08 00:06:00')
       --, (55555,'2018-01-08 00:05:00',NULL)

;WITH AllMinutes (OrderNo, Order_Received, Order_Completes, [time]) AS
(
    SELECT OrderNo, Order_Received, Order_Completes,
           Order_Received AS [time]
    FROM @myData
    UNION ALL
    SELECT OrderNo, Order_Received, Order_Completes, 
           DATEADD(MINUTE,1,[time])
    FROM AllMinutes
    WHERE [time]<ISNULL(Order_Completes,CURRENT_TIMESTAMP)

)

SELECT OrderNo,
       [time],
       CASE WHEN [time] < ISNULL(Order_Completes,CURRENT_TIMESTAMP) THEN 1 ELSE 0 END,
       CASE WHEN [time] = ISNULL(Order_Completes,CURRENT_TIMESTAMP) THEN 1 ELSE 0 END
FROM AllMinutes
WHERE [time] <= ISNULL(Order_Completes,CURRENT_TIMESTAMP)
ORDER BY OrderNo, [time]
OPTION(MAXRECURSION 0)

答案 2 :(得分:0)

只需使用递归CTE方法

;with cte as
(
    select OrderNo, order_completes, order_received  from table
    union all
    select OrderNo,order_completes, dateadd(minute,1,order_received) order_received 
    from cte
    where cte.order_received < order_completes
)
select c.OrderNo,
       c.order_received [Time],
       (case when c.order_received <> c.order_completes then 1 else 0 end) [Order_received],
       (case when c.order_received = c.order_completes then 1 else 0 end) [Order_received]    
from cte c
--option (MAXRECURSION 0)

答案 3 :(得分:-2)

declare @iMinn datetime;
set @iMinn = (select top 1 time from [your_table] where 
              OrderNo. = 12345 order by time);
while @iMinn < (select top 1 time from [your_table] where OrderNo. = 
                12345 and order_complete = 1 order by time desc)  
begin
    select 
    OrderNo.,
    time,
    Order_received,
    order_complete
    from [your_table];
    set @iMinn = dateadd (minute,1,@iMinn);
end