sql - SQL 中的年度队列分析

标签 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 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;

但是,您的同类群组功能的逻辑似乎存在缺陷。您应该将问题编辑为:

  1. 更详细地说明您希望如何计算留存率
  2. 添加表结构和一些示例数据
  3. 显示预期结果。

关于sql - SQL 中的年度队列分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37403356/

相关文章:

sql - LEFT JOIN 返回空结果集

postgresql - Postgres : Which is the order execution of triggers that are specified for different releations but activated by the same event?

mysql - 我如何在 PostgreSQL 中编写这个查询?

sql - 按开放金额比例分配

sql - 如何根据 SQL Server 中的最高点和最低时间计算排名

sql - 具有可变文件名的批量插入

MySql:来自不同表的 JOIN 和 SUM

c# - 带有 IN 语句的 Oracle 参数?

mysql - 编写带有计数的 SQL 查询

sql - 请问这个案例如何查询?