【问题标题】:Selecting current valid record of historical Data with SQL使用 SQL 选择历史数据的当前有效记录
【发布时间】:2020-05-05 12:55:29
【问题描述】:

我有两张桌子

表客户

  • customer_shortcut (char)

表客户数据

  • customerID(客户的外键)
  • customer_valid(备案有效日期)
  • 客户名称(字符)

表 CustomerData 可以有多个客户记录,但有效日期不同,例如

01.01.2019
01.01.2020
01.01.2021

我设法使用查询获取每个客户的最后一条记录:

SELECT Customer.*
FROM Customer
    FULL JOIN CustomerData ON (Customer.id = CustomerData."customerID_id")
    FULL JOIN CustomerData CustomerData2 ON (Customer.id = CustomerData2."customerID_id" 
        AND (CustomerData.customer_valid < CustomerData2.customer_valid 
             OR CustomerData.customer_valid = CustomerData2.customer_valid 
             AND CustomerData.id < CustomerData2.id)
            )
WHERE CustomerData2.id IS NULL

我现在如何获取当前有效记录(在我的示例中为 customer_valid 01.01.2020 的记录)?

我尝试在查询中几乎每个位置添加“AND customer_valid

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    如果我对您的理解正确,您正在寻找“今天”(或任何给定日期)之前的最高“有效日期”。这可以使用 Postgres 中的横向连接来实现:

    SELECT c.*, cd.customer_name
    FROM customer c
      JOIN LATERAL (
        SELECT * 
        FROM customerdata cd 
        WHERE c.id = cd.customer_id
          AND cd.customer_valid <= current_date
        ORDER BY cd.customer_valid DESC 
        LIMIT 1
      ) cd on true
    

    一个更有效的选择是(在我看来)将有效期的开始和结束存储在daterange column

    create table customer_data
    (
      customer_id    int not null references customer, 
      valid_during   daterange not null,
      customer_name  text
    );
    

    使用exclusion constraint 可以防止范围重叠

    您问题中的示例范围将存储为

    [2019-01-01,2020-01-01)
    [2020-01-01,2021-01-01)
    [2021-01-01,infinity)
    

    ) 表示排除右边缘。

    然后查询变得如此简单:

    SELECT c.*, cd.customer_name
    FROM customer c
      JOIN customer_data cd 
        on c.id = cd.customer_id
       AND cd.valid_during @> current_date;
    

    【讨论】:

      猜你喜欢
      • 2015-06-01
      • 1970-01-01
      • 2020-07-21
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多