SQL - 在两个连续记录中减去日期,然后求平均值

标签 sql postgresql

我已经坚持了这么长时间。
假设您有一个名为 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/

相关文章:

mysql - 为什么要用子查询来获取原表?

MySQL 函数有限制

sql - 你如何进行 Oracle SQL 查询

postgresql - 使用 DataGrip 从 CSV 导入时预配置列类型

postgresql - 错误 : argument of HAVING must be type boolean, 未键入 double

java - PostgreSQL JDBCPreparedStatement的setBytes更改参数值

php - 使用 like 在多个列上选择一个值

SQL Server 在定义的时间之前获取记录

postgresql - pgadmin4 指定的用户不存在

json - 分层 JSON 对象的 PostgreSQL 物化路径/Ltree