[在称为原因的表上查找一行时:
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,但这超出了我的技能水平。
因为这是我的数据集的一个非常普遍的要求,所以我希望有一个可以应用的优雅解决方案?
类似这样的东西:
您可以这样操作:它将为您提供每个machine_id