如何在PostgreSQL中查找指定日期的精确匹配或前后最近记录
在PostgreSQL中查找日期匹配或紧邻的前后记录
数据表结构
我有一个名为prices的PostgreSQL数据表,结构及数据如下:
| id | column_1 | column_2 | column_3 | date_col |
|---|---|---|---|---|
| 1 | 1.5 | 1.7 | 1.6 | 1234560000 |
| 2 | 0.9 | 1.1 | 1.0 | 1234570000 |
| 3 | 11.5 | 23.5 | 17.5 | 1234580000 |
| 4 | 8.3 | 12.3 | 10.3 | 1234600000 |
需求
- 若输入日期在
date_col中存在,返回精确匹配的行(例如输入1234580000时返回对应id为3的行); - 若日期不存在,返回该日期前后紧邻的两条记录(例如输入
1234590000时返回id为3和4的行)。
尝试过程
最初用Python判断结果后多次查询,效率较低。曾参考类似写法编写SQL,但该语句仅在日期存在时有效:
SELECT * FROM prices, (SELECT id, next_val, last_val FROM (SELECT t.*, LEAD(t.id, 1) OVER (ORDER BY t.date_col) as next_val, LAG(t.id, 1) OVER (ORDER BY t.date_col) as last_val FROM prices AS t) AS s WHERE 1234580000 IN (s.date_col, s.next_val, s.last_val)) AS x WHERE prices.id = x.id OR prices.id = x.next_val OR prices.id = x.last_val
最终可行SQL
SELECT * FROM (SELECT * FROM prices WHERE prices.date_col <= 1234580000 ORDER BY prices.date_col DESC LIMIT 1) AS a UNION (SELECT * FROM prices WHERE prices.date_col >= 1234580000 ORDER BY prices.date_col ASC LIMIT 1)
内容的提问来源于stack exchange,提问作者Jacob Dallas
相关产品推荐
相关产品推荐

