我已经坚持了这么长时间。
假设您有一个名为 Stays 的表,该表显示每个人在特定酒店入住和退房的日期:
+---------+------------+------------+
| stay_id | event_type | date |
+---------+------------+------------+
| 156 | check-in | 2019-03-21 |
| 156 | check-out | 2019-03-23 |
| 157 | check-in | 2019-03-23 |
| 157 | check-out | 2019-03-24 |
| 158 | check-in | 2019-03-25 |
| 158 | check-out | 2019-03-28 |
+---------+------------+------------+
假设每次入住只有两条记录(入住和退房),并且退房日期总是在入住日期之后。
您如何知道一个人在这家酒店的平均住宿天数(也就是入住日期和退房日期之间的平均住宿天数)?在伪代码中,我知道对于每个 stay_id,我必须使用 DATEDIFF 减去结账日期 - 入住日期,然后得到所有结果的平均值,也许使用 LAG 窗口函数?我把表放在 SQLFiddle 中,但卡住了。预期结果将是:
+-----+
| AVG |
+-----+
| 2 |
+-----+
最佳答案
这是您的查询。您只需要 left join
check-out
类型
select avg(date_part('day', t2.dated::timestamp - t1.dated::timestamp)) from test t1
left join test t2 on t2.event_type = 'check-out' and t1.stay_id = t2.stay_id
where t1.event_type = 'check-in'
参见 dbfiddle
关于SQL - 在两个连续记录中减去日期,然后求平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58907174/