我有一个表,其中存储了一个时间点的值:
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(time) 函数,因此您可能必须替换它们。
关于SQL:为最接近特定时间的每一天选择一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3759743/