Sql 一系列日期的最近记录
我知道,要获得日期之前最接近的记录,我可以使用以下查询:Sql 一系列日期的最近记录,sql,postgresql,datetime,Sql,Postgresql,Datetime,我知道,要获得日期之前最接近的记录,我可以使用以下查询: select * from results where resulttime = (select max(resulttime) from results where some_id = 15 and resulttime < '2012-07-27'); 但我需要连续几天这样做,这样我才能知道每天
select *
from results
where resulttime = (select max(resulttime)
from results
where some_id = 15
and resulttime < '2012-07-27');
但我需要连续几天这样做,这样我才能知道每天最接近的记录。有什么想法吗
天数序列将由generate_序列生成
最近的前一记录可能在我们想要的值的前一天,但仍然需要返回。一个简单的子查询可以从类似于您的示例的时间序列中确定一天边界内的最大日期,如下所示
SELECT max(resulttime), date_trunc('days',resulttime) FROM results GROUP BY 2;
也就是说,使用函数将时间戳仅固定在day组件上,然后使用GROUP BY max收集每个被截断日期的最大时间戳应该是最简单、最快的,使用左连接和DISTINCT ON: 我使用a来提供值,可以是一个表或函数,也可以是一个未赋值的数组,或者是一个由其他内容生成的集合。你的意思是通过生成序列生成序列吗 首先,我将搜索时间戳连接到表中具有更早或相等结果时间的所有行。我使用LEFT JOIN而不是JOIN,这样当表中根本没有先前的resulttime时,搜索时间戳就不会被删除
使用DISTINCT ON x.search_ts和ORDER BY x.search_ts、r.resulttime DESC,我们可以得到最大的或同等最大的结果时间,该结果时间小于或等于每个搜索时间戳。您的数据类型是什么-日期还是时间戳?精确地定义最近的。您如何提供一系列的天数?作为表中的日期,每行一个日期?它们属于时间戳类型。前最近记录定义为给定日期之前的第一条记录。这可能包括前一天的记录。谢谢,但我相信如果只限制一天,将错过之前最接近的结果在另一天出现的场景。
WITH x(search_ts) AS (
VALUES
('2012-07-26 20:31:29'::timestamp) -- search timestamps
,('2012-05-14 19:38:21')
,('2012-05-13 22:24:10')
)
SELECT DISTINCT ON (x.search_ts)
x.search_ts, r.id, r.resulttime
FROM x
LEFT JOIN results r ON r.resulttime <= x.search_ts -- smaller or same
-- WHERE some_id = 15 -- some condition?
ORDER BY x.search_ts, r.resulttime DESC;
search_ts | id | resulttime
--------------------+--------+----------------
2012-05-13 22:24:10 | 404643 | 2012-05-13 22:24:10
2012-05-14 19:38:21 | 404643 | 2012-05-13 22:24:10
2012-07-26 20:31:29 | 219822 | 2012-07-25 19:47:44