为了获取新信息,我尝试与表关联,但似乎MS访问中没有OUTER APPLY。这是我的代码:
SELECT *
FROM [pred-predi_calculo-presi]
OUTER APPLY
( SELECT TOP 1 [snptc_histo].POSICIONBUS
FROM [snptc_histo]
WHERE [snptc_histo].PATENTEBUS = [pred-predi_calculo-presi].PATENTE
AND [snptc_histo].horaConsulta < [pred-predi_calculo-presi].'pasadaReal'
ORDER BY [snptc_histo].horaConsulta DESC
) AS p
OUTER APPLY
( SELECT TOP 1 [snptc_histo].POSICIONBUS
FROM [snptc_histo]
WHERE [snptc_histo].PATENTEBUS = [pred-predi_calculo-presi].PATENTE
AND [snptc_histo].horaConsulta >= [pred-predi_calculo-presi].'pasadaReal'
ORDER BY [snptc_histo].horaConsulta ASC
) AS n ;
任何帮助都会受到欢迎
编辑:我认为使用java代码执行此操作会更容易(我有算法)并且更加优化,但我没有合适的工具比如数据结构或权利&#34;命令&#34;使用数据库抛出java(我是数学家)所以要在java中这样做我需要更多的帮助。虽然我对此解决方案的评论持开放态度。 这是一个示例数据:
预解码值-predi_calculo-PRESI:
Id1 ID Paradero'horaPrediccion''pasadaReal'PREDICCION_NUEVA PATENTE servicio
1 2016-12-13 11:36:50_T518 PA52 11:36:51 11:36:20 1579,242 CJRW-73 518
2 2016-12-13 11:36:50_T518 PA52 11:36:51 11:36:20 761,211 BJFB-79 518
3 2016-12-13 12:11:02_T518 PC475 12:17:53 12:16:34 1382,545 BFKC-47 518
4 2016-12-13 12:11:02_T518 PC475 12:17:53 12:16:34 695,283 CJRW-74 518
5 2016-12-13 12:11:03_T418 PC206 12:16:27 12:15:50 1210,033 ZN-6742 418
6 2016-12-13 12:11:03_T418 PC206 12:16:27 12:15:50 1407,741 ZN-5814 418
7 2016-12-13 13:16:41_T516 PD208 13:17:56 13:18:02 842,634 BJFY-17 516
snptc_histo:
PATENTEBUS POSICIONBUS horaConsulta
WA-9114 0 17:15:52
CJRW-83 3,64 17:15:52
ZN-3967 0,26 17:15:50
BJFV-89 11,06 17:15:51
BJFS-92 32,866 17:15:51
FLXJ-30 19,74 17:15:51
BJFR-52 9,55 17:15:50
CJRW-52 24,67 17:15:50
BJFR-94 14,75 17:15:49
CJRT-63 16,02 17:15:49
答案 0 :(得分:1)
在Access中不是最简单的事情,但请尝试以下操作。
Query1 - 查找每个PATENTEBUS值的最大horaConsulta值小于pasadaReal的中间查询:
SELECT s.PATENTEBUS, MAX(horaConsulta) AS MaxHoraConsulta
FROM [snptc_histo] AS s
INNER JOIN [pred-predi_calculo-presi] AS p ON s.PATENTEBUS = p.PATENTE
WHERE s.horaConsulta < p.pasadaReal
GROUP BY s.PATENTEBUS
Query2 - 使用Query1查找关联的POSICIONBUS值:
SELECT s.PATENTEBUS, s.POSICIONBUS
FROM [snptc_histo] AS s
INNER JOIN Query1 AS q ON s.PATENTEBUS = q.PATENTEBUS AND s.horaConsulta = q.MaxHoraConsulta
现在创建类似的查询,以便为每个PATENTEBUS值及其关联的POSICIONBUS值找到大于或等于pasadaReal的min horaConsulta值:
QUERY3
SELECT s.PATENTEBUS, MIN(horaConsulta) AS MinHoraConsulta
FROM [snptc_histo] AS s
INNER JOIN [pred-predi_calculo-presi] AS p ON s.PATENTEBUS = p.PATENTE
WHERE s.horaConsulta >= p.pasadaReal
GROUP BY s.PATENTEBUS
Query4
SELECT s.PATENTEBUS, s.POSICIONBUS
FROM [snptc_histo] AS s
INNER JOIN Query3 AS q ON s.PATENTEBUS = q.PATENTEBUS AND s.horaConsulta = q.MinHoraConsulta
现在您的最终查询变为:
SELECT p.*, q2.POSICIONBUS, q4.POSICIONBUS
FROM ([pred-predi_calculo-presi] AS p
LEFT JOIN Query2 AS q2 ON p.PATENTE = q2.PATENTEBUS)
LEFT JOIN Query4 AS q4 ON p.PATENTE = q4.PATENTEBUS