Postgresql根据基于日期的日历表计算入住率
我在postgreSQL数据库中有一个Postgresql根据基于日期的日历表计算入住率,postgresql,Postgresql,我在postgreSQL数据库中有一个property\u calendars表,每个属性都有一个每行一天的结构。以下是一个月的csv属性示例数据: "id","property_id","status","price","currency","date","note","created_at","updated_at" 30053752,56,"booked",170,"GBP","2017-10-01",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
property\u calendars
表,每个属性都有一个每行一天的结构。以下是一个月的csv属性示例数据:
"id","property_id","status","price","currency","date","note","created_at","updated_at"
30053752,56,"booked",170,"GBP","2017-10-01",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053753,56,"booked",286,"GBP","2017-10-02",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053754,56,"booked",271,"GBP","2017-10-03",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053755,56,"booked",263,"GBP","2017-10-04",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053756,56,"booked",278,"GBP","2017-10-05",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053757,56,"booked",284,"GBP","2017-10-06",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053758,56,"booked",252,"GBP","2017-10-07",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053759,56,"booked",254,"GBP","2017-10-08",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053760,56,"available",247,"GBP","2017-10-09",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053761,56,"booked",170,"GBP","2017-10-10",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053762,56,"booked",170,"GBP","2017-10-11",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053763,56,"booked",170,"GBP","2017-10-12",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053764,56,"booked",170,"GBP","2017-10-13",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053765,56,"booked",170,"GBP","2017-10-14",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053766,56,"booked",170,"GBP","2017-10-15",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053767,56,"booked",170,"GBP","2017-10-16",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053768,56,"unavailable",170,"GBP","2017-10-17",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053769,56,"unavailable",170,"GBP","2017-10-18",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053770,56,"unavailable",170,"GBP","2017-10-19",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053771,56,"booked",170,"GBP","2017-10-20",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053772,56,"booked",170,"GBP","2017-10-21",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053773,56,"booked",170,"GBP","2017-10-22",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053774,56,"booked",170,"GBP","2017-10-23",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053775,56,"booked",170,"GBP","2017-10-24",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053776,56,"booked",170,"GBP","2017-10-25",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053777,56,"booked",170,"GBP","2017-10-26",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053778,56,"booked",170,"GBP","2017-10-27",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053779,56,"booked",170,"GBP","2017-10-28",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053780,56,"available",170,"GBP","2017-10-29",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053781,56,"booked",170,"GBP","2017-10-30",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
30053782,56,"booked",170,"GBP","2017-10-31",,"2018-04-19 04:04:48","2018-04-19 04:04:48"
在这样的表上查询给定时间段的占用率的最佳方法是什么?在这种情况下,计算占用率的公式是:x=(n-u)/n*100
n = total nights
u = unavailable nights
b = booked nights
x = occupancy
在上述数据中,
26/31*100=87.83%
当月入住率您可以使用带有条件的计数
,然后根据您的公式计算入住率(注意:正确的公式似乎是b/(n-u)*100
,它给出了83.87%
)
从PostgreSQL 9.4开始,您还可以使用COUNT(*)过滤器(…)
子句:
SELECT
COUNT(*) FILTER (WHERE status = 'booked') b
...
FROM occupancy
显示示例数据和预期结果。只有文本格式,请不要图片。获得入住率的公式是什么?很多人不知道占用率是什么意思。你真的不需要这些字符串的
E
前缀。谢谢@Dan和Kaushik-我已经更新了问题,使其更加明确,并包括示例data@eurotrash-粘贴数据而不是感谢-实际上,此用例中的入住率需要表示为可用夜晚的百分比(总夜数-不可用夜数)好的,我已将公式更新为b*100.0/(n-u)
。我希望它是正确的。这是一个很好的解决方案。谢谢。
SELECT
COUNT(*) FILTER (WHERE status = 'booked') b
...
FROM occupancy