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

问题描述 投票:-2回答:4

我有一个表中有订单详细信息,例如,如果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   
sql sql-server
4个回答
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')

你可以加入你的结果


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)

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)

-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
© www.soinside.com 2019 - 2024. All rights reserved.