Select 连接表的最小日期差异
Select Min Datediff from joined tables
我目前在 BigQuery 工作。我有两个表:
Table A {
id int
b_id int
date timestamp
}
Table B {
id int
long float
lat float
date timestamp
}
对于 A
中的一个 b_id
,B
中有多个条目。我想 有效地 连接两个表,并且只使用 B
中的条目,其中 A.b_id = B.id
并且时间戳之间的差异很小。
我目前的解决方案是:
SELECT A.*, B.*, ABS(DATETIME_DIFF(DATETIME(A.date), DATETIME(B.date), SECOND)) as timeDiff
FROM A
INNER JOIN B
ON A.b_id = B.id
WHERE ABS(DATETIME_DIFF(DATETIME(A.date), DATETIME(B.date), SECOND)) =
(
SELECT MIN(ABS(DATETIME_DIFF(DATETIME(B2.date), DATETIME(A2.date), SECOND)))
FROM B as B2
INNER JOIN A as A2
ON B2.driverId = A2.driverId
GROUP BY A2.driverId, B2.rideId
)
问题是单个条目需要花费很多时间。
关于如何改进查询有什么建议吗?
您可以使用 window 函数:
select *
from (
select a.*, b.*,
row_number() over(
partition by a.b_id
order by abs(datetime_diff(datetime(a.date), datetime(b.date), second))
) rn
from a
inner join b on a.b_id = b.id
) t
where rn = 1
我目前在 BigQuery 工作。我有两个表:
Table A {
id int
b_id int
date timestamp
}
Table B {
id int
long float
lat float
date timestamp
}
对于 A
中的一个 b_id
,B
中有多个条目。我想 有效地 连接两个表,并且只使用 B
中的条目,其中 A.b_id = B.id
并且时间戳之间的差异很小。
我目前的解决方案是:
SELECT A.*, B.*, ABS(DATETIME_DIFF(DATETIME(A.date), DATETIME(B.date), SECOND)) as timeDiff
FROM A
INNER JOIN B
ON A.b_id = B.id
WHERE ABS(DATETIME_DIFF(DATETIME(A.date), DATETIME(B.date), SECOND)) =
(
SELECT MIN(ABS(DATETIME_DIFF(DATETIME(B2.date), DATETIME(A2.date), SECOND)))
FROM B as B2
INNER JOIN A as A2
ON B2.driverId = A2.driverId
GROUP BY A2.driverId, B2.rideId
)
问题是单个条目需要花费很多时间。 关于如何改进查询有什么建议吗?
您可以使用 window 函数:
select *
from (
select a.*, b.*,
row_number() over(
partition by a.b_id
order by abs(datetime_diff(datetime(a.date), datetime(b.date), second))
) rn
from a
inner join b on a.b_id = b.id
) t
where rn = 1