我的问题是针对我手头的问题,所以我会首先尝试解释这个场景。我需要编写一个sql查询。以下是场景:
table1的表格列:
effective_date
expire_date
amount_value
state_id
amount_entry_type
案例1,输入值:
input_date
我使用以下sql查询实现了它:
示例查询:
select state_id, sum(amount)
from table1
where state_id=3 and (input_date between effective_date and expiry_date)
group by state_id;
我的问题:
现在我有一个日期范围,我希望在日期范围之间的所有日期实现上述目标。
输入值2:
input_start_date
input_end_date
预期输出:
找到amount_value grouped by states where input_date between effective and expire_date for input_date between input_start_date and input_end_date
的总和。
因此,查询会为日期范围2016-07-07
和2016-07-08
提供以下示例结果:
state amount_sum date
California 100 2016-07-07
Florida 200 2016-07-08
我使用postgres作为数据库和django来查询和处理结果 选项:
1. Fetch all the data and process using python.
2. Loop over given date range and fire the query above as:
for input_date in date_range(input_start_date, input_end_date):
//Execute above query
以上解决方案都可能存在性能问题,所以我想知道是否可以使用单个SQL查询实现它。
答案 0 :(得分:1)
您确实可以通过单个查询执行此操作,使用generate_series()
set-returning-function来创建日期列表。如果您确定所有日期都有相应的状态行,那么您可以使用常规JOIN
,否则请使用LEFT JOIN
,如下所示。
SELECT state_id, sum(amount), dt AS "date"
FROM generate_series(input_start_date, input_end_date, '1 day') dates(dt)
LEFT JOIN table1 ON state_id = 3 AND (dt BETWEEN effective_date AND expiry_date)
GROUP BY state_id, dt;