Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL选择历史数据的当前有效记录_Sql_Postgresql - Fatal编程技术网

使用SQL选择历史数据的当前有效记录

使用SQL选择历史数据的当前有效记录,sql,postgresql,Sql,Postgresql,我有两张桌子 桌上顾客 客户快捷方式(字符) 表CustomerData customerID(客户的外键) 客户\有效(记录的有效日期) 客户名称(字符) 表CustomerData可以有多条客户记录,但有效日期不同,即 2019年1月1日 01.01.2020 01.01.2021 我通过查询获得了每个客户的最后一条记录: SELECT Customer.* FROM Customer FULL JOIN CustomerData ON (Customer.id = Cus

我有两张桌子

桌上顾客

  • 客户快捷方式(字符)
表CustomerData

  • customerID(客户的外键)
  • 客户\有效(记录的有效日期)
  • 客户名称(字符)
表CustomerData可以有多条客户记录,但有效日期不同,即

2019年1月1日
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
选择客户*
来自客户
上的完全加入CustomerData(Customer.id=CustomerData.“customerID\u id”)
完全加入CustomerData CustomerData2 ON(Customer.id=CustomerData2.“customerID\u id”
和(CustomerData.customer\u valid
我现在如何获取当前有效记录(在我的示例中是customer_valid 01.01.2020的记录)


我试图添加“AND customer_valid,如果我理解正确,您正在寻找“今天”(或任何给定日期)之前的最高“有效日期”。这可以通过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
可以使用

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

[2019-01-012020-01-01)
[2020-01-01,2021-01-01)
[2021-01-01,无穷大)
表示排除了右边缘

然后,查询变得非常简单,如下所示:

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