Sql查询各个日期值的日期范围

时间:2016-08-10 07:43:07

标签: sql django postgresql

我的问题是针对我手头的问题,所以我会首先尝试解释这个场景。我需要编写一个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-072016-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查询实现它。

1 个答案:

答案 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;