[使用表作为队列在SQL Server 2017中查找条件的先前值

问题描述 投票:1回答:2

[在称为原因的表上查找一行时:

machine_id  reason   start_time
001234      moving   10:00:00
001234      parked   10:10:00
001234      moving   10:15:00
001234      NULL     10:20:00
001234      NULL     10:25:00
001234      dumping  10:30:00

009876      parked   10:00:00
009876      NULL     10:10:00
009876      NULL     10:15:00
009876      moving   10:20:00
009876      dumping  10:25:00

出于任何原因使用NULL值,我都需要获取不为NULL的最新值,因此001234 NULL值都将变为“移动”,而009876 NULL值都将变为“停放”。

我通常会通过交叉应用来解决此问题,例如:

SELECT 
    r1.machine_id    
    ,ISNULL(r1.reason,r2.reason) AS reason
    ,r1.start_time
FROM #reason r1
CROSS APPLY(
    SELECT TOP 1
            r2.reason
    FROM #reason r2
    WHERE r2.machine_oid = r1.machine_oid 
    AND r2.start_time < r1.start_time
    AND r2.reason IS NOT NULL
    ORDER BY start_time DESC
) r2

但是我要查询的表是成百上千的行(无法修改源数据库),查询的复杂度似乎接近n ^ 2。

在C ++中,我将通过使用优先级队列并丢弃对象列表中的项目以检查是否不符合条件来解决,因此复杂度更接近nlogn。

[我试图在此处了解有关将表用作队列的文章:http://rusanu.com/2010/03/26/using-tables-as-queues,但这超出了我的技能水平。

因为这是我的数据集的一个非常普遍的要求,所以我希望有一个可以应用的优雅解决方案?

sql sql-server tsql sql-server-2017
2个回答
2
投票

类似这样的东西:


0
投票

您可以这样操作:它将为您提供每个machine_id

© www.soinside.com 2019 - 2024. All rights reserved.