我正在尝试进行同类群组分析 - 尝试计算留存率。这是我的代码:
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;
虽然它根本不起作用...... 我收到的错误消息是:提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。
如果有一些建议会很棒。
最佳答案
直接的问题是 datetime()
函数,它在 PostgreSQL 中不存在。然后是别名和聚合的一些问题。这应该让你更接近你想去的地方:
SELECT
<b>b1.</b>renter_id,
min(DATE_PART('year', <b>b1.</b>created_at)) AS first_rental_year,
<strike>DATE_PART('year', created_ay) AS y1,</strike> -- Needs an aggregate
round(100<b>.</b> * 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;
但是,您的同类群组功能的逻辑似乎存在缺陷。您应该将问题编辑为:
- 更详细地说明您希望如何计算留存率
- 添加表结构和一些示例数据
- 显示预期结果。
关于sql - SQL 中的年度队列分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37403356/