我有两张桌子:

日期:

date
2024-01-01
2024-01-02
2024-01-03
2024-01-04
2024-01-05

当前:

business_date id
2024-01-01 1
2024-01-02 2
2024-01-04 4
2024-01-05 5

我希望在条件DATE=BERVICE_DATE的情况下连接这些表,但是在日期没有匹配的情况下,它将获得前一个日期的记录.因此,生成的表格将如下所示:

business_date id date
2024-01-01 1 2024-01-01
2024-01-02 2 2024-01-02
2024-01-02 2 2024-01-03
2024-01-04 4 2024-01-04
2024-01-05 5 2024-01-05

我该如何做到这一点呢?

推荐答案

SELECT
  *
FROM
  dates
CROSS JOIN LATERAL
(
  SELECT
    *
  FROM
    actual
  WHERE
    actual.business_date <= dates.date
  ORDER BY
    actual.business_date DESC
  LIMIT
    1
)
  AS actual

或者...

WITH
  actual_ranged AS
(
  SELECT
    *,
    LEAD(business_date, 1, 'infinity')
      OVER (
        ORDER BY business_date
      )
        AS next_business_date
  FROM
    actual
)
SELECT
  *
FROM
  actual_ranged AS a
LEFT JOIN
  dates         AS d
    ON  d.date >= a.business_date
    AND d.date <  a.next_business_date

演示:https://dbfiddle.uk/tzjjhZJu

Sql相关问答推荐

当编号和版本的唯一状态更改时报告

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

如何在一个范围内进行分组.""范围值在范围表中定义

Postgres JSONB对象筛选

当交叉联接3个或更多表时,实体框架中是否会传输冗余的行数据并占用数据库带宽?

如何更新SQLite数据库中的表?

SQL:计算与另一列中给定值互斥的匹配项

值对于类型字符来说太长

PostgreSQL 9.6嵌套的INSERT/RETURN语句的CTE性能低得令人无法接受

如何使用SQL Server中的Nodes()方法执行与OPENXML相同的操作

根据时间、状态和相关行在PostgreSQL中的存在来删除行

优化Postgres搜索未知长度的子串

Grafana SQL 模板变量(值、文本)

SQL for Smarties 类型问题:从表中 Select 记录,并对某些值进行分组

REGEXP_SUBSTR使用方法

Teradata 多个进程的最大进程结束时间捕获

如何对 SQL 表中的连续时间戳进行分组?

具有日期时间条件的存储过程

如何根据 Amazon Athena 中的多个列值删除重复行?

查找距上一条记录大于或等于 30 天的记录