SQL中的年度队列分析
我试图做一个队列分析——试图计算保留率。这是我的密码:SQL中的年度队列分析,sql,postgresql,Sql,Postgresql,我试图做一个队列分析——试图计算保留率。这是我的密码: SELECT renter_id, min(DATE_PART('year', created_at)) AS first_rental_year, DATE_PART('year', created_ay) AS y1, round(100 * count(distinct b2.renter_id) / count(distinct b1.renter_id)) AS retention FROM
SELECT
renter_id,
min(DATE_PART('year', created_at)) AS first_rental_year,
DATE_PART('year', created_ay) AS y1,
round(100 * count(distinct b2.renter_id) /
count(distinct b1.renter_id)) AS retention
FROM bookings AS b1
LEFT JOIN bookings AS b2 ON
b1.renter_id = b2.renter_id
AND DATE_PART('year', b1.created_at) = DATE_PART(datetime('year', b2.created_at, '-1 year'))
GROUP BY 1
ORDER BY 2;
但它根本不起作用。。。我收到的错误消息是:提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换
有一些建议会很棒的 直接的问题是PostgreSQL中不存在的datetime函数。还有一些别名和聚合的问题。这会让你更接近你想去的地方:
SELECT
b1.renter_id,
min(DATE_PART('year', b1.created_at)) AS first_rental_year,
DATE_PART('year', created_ay) AS y1, -- Needs an aggregate
round(100. * count(distinct b2.renter_id) / -- Use float, see 100.
count(distinct b1.renter_id)) AS retention
FROM bookings AS b1
LEFT JOIN bookings AS b2
ON b1.renter_id = b2.renter_id
AND extract(year, b1.created_at) + 1 = extract(year, b2.created_at)
GROUP BY 1
ORDER BY 2;
然而,你的群组功能的逻辑似乎有缺陷。您应该将问题编辑为:
更详细地解释如何计算保留期
添加表结构和一些示例数据
显示预期结果。
直接的问题是PostgreSQL中不存在的datetime函数。还有一些别名和聚合的问题。这会让你更接近你想去的地方:
SELECT
b1.renter_id,
min(DATE_PART('year', b1.created_at)) AS first_rental_year,
DATE_PART('year', created_ay) AS y1, -- Needs an aggregate
round(100. * count(distinct b2.renter_id) / -- Use float, see 100.
count(distinct b1.renter_id)) AS retention
FROM bookings AS b1
LEFT JOIN bookings AS b2
ON b1.renter_id = b2.renter_id
AND extract(year, b1.created_at) + 1 = extract(year, b2.created_at)
GROUP BY 1
ORDER BY 2;
然而,你的群组功能的逻辑似乎有缺陷。您应该将问题编辑为:
更详细地解释如何计算保留期
添加表结构和一些示例数据
显示预期结果。
你到底想在这里做什么DATE_PARTdatetime'year',b2.created_at,'-1 year',这意味着只连接b1中的日期比b2中的日期小一倍的行,这就可以查看承租人是否租用了不止一次,据我所知,postgresql中没有名为datetime的函数…同样,当你说b2中的b1小于日期时,您正在少做1年?也许您正在寻找类似于此日期_PART'year',b1.created_at=从b2提取年份。created_at-1您在这里到底想做什么日期_PARTdatetime'year',b2.created_at,'-1 year'这意味着只连接b1中的日期比b2中的日期少一行,就我所知,postgresql中没有名为datetime的函数…当你说b2中的b1小于date时,你是在少做1年?也许你在寻找类似于这个日期的东西,比如“PART'year”,b1.created_at=从b2中提取年份。created_at-11。我想知道我们在租客第一年租住他们的情况有多好/差。那么,我们是否保留了2013年第一个租赁年的租客,而不是2015年第一个租赁年的租客?2.3.见2.1。我想知道我们在租客第一年租住他们的情况有多好/差。那么,我们是否保留了2013年第一个租赁年的租客,而不是2015年第一个租赁年的租客?2.3.见第2条。