Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中的年度队列分析_Sql_Postgresql - Fatal编程技术网

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条。