我有一个表(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。
请问您可以如何完成此查询?
答案 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