通过检查postgres中给定范围的每一天来选择值

时间:2018-07-29 13:32:32

标签: sql postgresql

我有一个表(prop_rate_info),其中存储了特定的按日属性和可用性信息。 喜欢:

+-----------+---------------+---------------+----------------+----------+
| id        | property_id   | check_in_date | available_room | price    |
| (integer) | (integer)     | (date)        | (integer)      | (double) | 
+-----------+---------------+---------------+----------------+----------+
| 1         | 1             | 2018-07-20    | 2              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 2         | 1             | 2018-07-21    | 2              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 3         | 1             | 2018-07-23    | 2              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 4         | 2             | 2018-07-20    | 4              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 5         | 2             | 2018-07-21    | 1              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 6         | 2             | 2018-07-22    | 0              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 7         | 2             | 2018-07-23    | 4              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 8         | 3             | 2018-07-20    | 5              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 9         | 3             | 2018-07-21    | 5              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 10        | 3             | 2018-07-22    | 5              | 200      |
+-----------+---------------+---------------+----------------+----------+
| 11        | 3             | 2018-07-23    | 5              | 200      |
+-----------+---------------+---------------+----------------+----------+

我将以整数形式提供可用房间的日期范围和值。 查询应搜索范围的每个日期(从给定范围), 如果每天都有属性的可用房间价值,则会提供属性ID,否则将忽略属性。

这意味着,如果我指定日期范围为2018-07-20至2018-07-23,并且可用客房价值为2, 那么它应该每天检查一下(20日,21日,22日,23日)某物业是否有2个可用房间, 如果全天都有该可用房值,则会提供一个属性ID。

这样,它将给出所有属性ID。

我尝试使用此查询:

select property_id from prop_rate_info
where DATE(check_in_date) BETWEEN '2018-07-20' AND '2018-07-23' 
and available_room >= 2
group by property_id;

这将给出所有属性ID,尽管对于那些给定范围而言,表格每天没有所有属性的rocord。

从上面给出的示例数据中,应该将property_id设置为3,因为它具有全天的记录,并且其available_room每天大于等于2。

请问您可以如何完成此查询?

1 个答案:

答案 0 :(得分:1)

从结束到开始日期的不同,并使用聚合函数

    select property_id from prop_rate_info
    where DATE(check_in_date) BETWEEN '2018-07-20' AND '2018-07-23' 
    and available_room >= 2
    group by property_id
    having count(*)=DATE_PART('day', '2018-07-23 00:00:00'::timestamp - '2018-07-20 00:00:00'::timestamp)+1

http://sqlfiddle.com/#!17/047ac/4

property_id
3