MS Access 交叉应用模拟
MS Access CROSS APPLY analogue
拥有 table 设备轨道。每个跟踪设备都有一个唯一的 ID,用户将他们的 GPS 轨迹上传到站点,指定跟踪设备 ID。此数据存储在 table 中,因此每行由 DeviceID
、Lat
、Lon
和 Date
列组成。示例:
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 多分钟。
拥有 table 设备轨道。每个跟踪设备都有一个唯一的 ID,用户将他们的 GPS 轨迹上传到站点,指定跟踪设备 ID。此数据存储在 table 中,因此每行由 DeviceID
、Lat
、Lon
和 Date
列组成。示例:
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 多分钟。