使用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
- 客户快捷方式(字符)
- customerID(客户的外键)
- 客户\有效(记录的有效日期)
- 客户名称(字符)
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;