MS Access 交叉应用模拟

MS Access CROSS APPLY analogue

拥有 table 设备轨道。每个跟踪设备都有一个唯一的 ID,用户将他们的 GPS 轨迹上传到站点,指定跟踪设备 ID。此数据存储在 table 中,因此每行由 DeviceIDLatLonDate 列组成。示例:

ID          DeviceID       Lon             Lat              Date
----------- -------------- --------------- ---------------- ----------------------- 
1652726     DLX*X-------   -20.56528769     20.68961421      2015-09-01 00:00:02.000
1652727     F4K*T-------   -20.95713512     20.80473833      2015-09-01 00:00:05.000
1652728     F4K*4-------   -20.87060998     20.00037712      2015-09-01 00:00:27.000
1652729     DLX*K-------   -20.87061003     20.00039333      2015-09-01 00:01:04.000
1652730     DLX*7-------   -20.87060189     20.00039248      2015-09-01 00:01:30.000
1652731     F4K*T-------   -20.8706208      20.00037551      2015-09-01 00:01:39.000
1652732     F4K*2-------   -20.87060854     20.00038717      2015-09-01 00:01:51.000
1652733     DLX*7-------   -20.90161642     20.98749573      2015-09-01 00:02:02.000
1652734     F4K*4-------   -20.87060145     20.0003771       2015-09-01 00:02:05.000
1652735     F4K*T-------   -20.0907285      20.00816632      2015-09-01 00:02:10.000
1652736     F4K*4-------   -20.90157325     20.98748467      2015-09-01 00:02:49.000
1652737     F4K*T-------   -20.22212807     20.77575096      2015-09-01 00:02:53.000
1652738     DLX*G-------   -20.87261384     20.00250375      2015-09-01 00:03:09.000
1652739     DLX*D-------   -20.76831339     20.08081263      2015-09-01 00:03:15.000
1652740     F4K*T-------   -20.76913834     20.08311954      2015-09-01 00:03:24.000
1652741     F4K*T-------   -20.53557613     20.78679804      2015-09-01 00:03:57.000
1652742     F4K*2-------   -20.8706104      20.00037474      2015-09-01 00:03:59.000
1652743     F4K*2-------   -20.76919089     20.0830366       2015-09-01 00:04:15.000

需要显示每个设备最近的5个坐标。我已经成功地编写了一个 T-SQL 查询,它做到了:

SELECT ss.[DeviceID], cc.*
FROM (SELECT DISTINCT [DeviceID] FROM [Device_Places]) ss
CROSS APPLY (SELECT TOP 5 S.[Date], S.Lat, S.Lon FROM [Device_Places] S
             WHERE S.DeviceID = ss.DeviceID
             ORDER BY S.[Date] DESC) cc

但是,不幸的是,这个 SQL 在 Microsoft Access 中无效(检查到 MS Access 2016)。我试图将带有 CROSS APPLY 的上述查询转换为自连接变体。但无济于事。将感谢任何可以帮助在 MS Access 中进行上述查询的等效查询的人。

我相信我终于想出了一个 MS Access 查询,类似于我之前发布的 CROSS APPLY 变体。

SELECT DP.*
FROM DEVICE_PLACES DP
WHERE DP.ID IN
(
    SELECT TOP 5 ID
    FROM DEVICE_PLACES
    WHERE DeviceID = DP.DeviceID
    ORDER BY [Date] DESC, ID
)

运行,然而,在超过 550,000 行的数据集上的自连接变体显示出灾难性的性能。将数据集缩减到每个设备的最近 5 个坐标需要 4 多分钟。