【问题标题】:Query to return the matching or nearest previous record by a list of dates查询以通过日期列表返回匹配的或最近的先前记录
【发布时间】:2020-02-07 20:46:02
【问题描述】:

我有一个按日期排序的记录表。每天最多有 1 条记录,但有些日子没有记录(周末和银行假日)。

当我按日期查询记录时,如果当天不存在记录,我会对按日期的上一条记录感兴趣。例如:

SELECT * FROM rates WHERE date <= $mydate ORDER BY date DESC LIMIT 1;

给定一个日期列表,我将如何构造一个查询以返回与每个日期的确切或最接近的先前记录匹配的多条记录?这可以在单个查询中实现吗?

日期数组可能分布在很长的时间范围内,但我不一定希望整个时间跨度中的每条记录(例如,查询 20 个日期分布在一年的时间跨度内)。

【问题讨论】:

  • 向我们展示一些示例表数据和预期结果。 (作为格式化文本,而不是图像。)

标签: sql database postgresql


【解决方案1】:

您可以将日期构造为派生表,然后使用 SQL 逻辑。横向连接很方便:

select v.dte, r.*
from (values ($date1), ($date2), ($date3)
     ) v(dte) left join lateral
     (select r.*
      from rates r
      where r.date <= v.dte
      order by r.date desc
      limit 1
     ) r
     on 1=1;

您可能会发现使用数组传递日期很有用,使用数组并在该数组上使用 unnest()

【讨论】:

  • 你比我快得多,但我的解决方案非常相似,所以我在这里添加小提琴作为评论:dbfiddle.uk/…
  • 太棒了。谢谢这完美的作品。使用unnest() 并最终需要将每个元素转换为子查询中的日期,但如果没有您的回答就不会到达那里:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多