[英]SQL: select one record for each day nearest to a specific time
我有一个表存储一个时间点的值:
CREATE TABLE values
(
value DECIMAL,
datetime DATETIME
)
每天可能有很多值,某一天也可能只有一个值。 现在我想获得给定时间段(例如一个月)中每天最接近给定时间的值。 如果有当天的记录,我只想每天获得一个值,如果没有记录,我只想获得没有值。 我的数据库是PostgreSQL。 我非常坚持这一点。 我可以在时间跨度中获取所有值并以编程方式为每一天选择最接近的值,但这意味着从数据库中提取大量数据,因为一天可能有很多值。
(更新)
为了使它更具抽象性:我有任意精度的数据(可能是一分钟,可能是两小时或两天),我想将它转换为一天的固定精度,具有一天的特定时间。
(第二次更新)
假设期望的时间是16:00,这是来自接受的答案的查询以及正确的postgresql类型转换:
SELECT datetime, value FROM values, (
SELECT DATE(datetime) AS date, MIN(ABS(EXTRACT(EPOCH FROM TIME '16:00' - CAST(datetime AS TIME)))) AS timediff
FROM values
GROUP BY DATE(datetime)
) AS besttimes
WHERE
CAST(values.datetime AS TIME) BETWEEN TIME '16:00' - CAST(besttimes.timediff::text || ' seconds' AS INTERVAL)
AND TIME '16:00' + CAST(besttimes.timediff::text || ' seconds' AS INTERVAL)
AND DATE(values.datetime) = besttimes.date
走向这个方向怎么样?
SELECT values.value, values.datetime
FROM values,
( SELECT DATE(datetime) AS date, MIN(ABS(_WANTED_TIME_ - TIME(datetime))) AS timediff
FROM values
GROUP BY DATE(datetime)
) AS besttimes
WHERE TIME(values.datetime) BETWEEN _WANTED_TIME_ - besttimes.timediff
AND _WANTED_TIME_ + besttimes.timediff
AND DATE(values.datetime) = besttimes.date
我不确定日期/时间提取和abs(时间)功能,所以你可能需要更换它们。
看来你要解决两个部分:
一天都有结果吗?
如果有,那么哪个是最近的?
如果没有结果,通过在第1部分短路过程,您将节省大量执行时间。
接下来要注意的是,你不必从数据库中提取数据,等到你有答案,或者先使用PLSQL函数(或其他东西)在服务器上完成它。
一旦您有选择的时间进行检查,您可以使用intervals
来比较它们。 检查有关间隔和日期时间函数的Postgres文档以获得精确的说明,但基本上您减去了您给定日期的选定日期,并且间隔最小的日期是您想要的日期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.