一尘不染

SQL:每天选择最接近特定时间的一条记录

sql

我有一个表,用于存储带有时间点的值:

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

阅读 166

收藏
2021-03-08

共1个答案

一尘不染

朝这个方向怎么样?

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)函数,因此您可能必须替换它们。

2021-03-08