Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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 Postgres:无法确定以完成行程结束的成功事件的百分比_Sql_Postgresql - Fatal编程技术网

Sql Postgres:无法确定以完成行程结束的成功事件的百分比

Sql Postgres:无法确定以完成行程结束的成功事件的百分比,sql,postgresql,Sql,Postgresql,SQL专家, 在我练习SQL技能的过程中,我试图解决这个具有挑战性的问题,但是我被卡住了,如果有人能帮助我,我将不胜感激 注册定义为事件表中标记为“注册成功”的事件。对于每个城市“A”和“B”以及一周中的每一天,确定2016年第一周导致在注册日期后10小时内完成旅行的注册人数百分比 表名:trips Column Name Datatype id integer clien

SQL专家, 在我练习SQL技能的过程中,我试图解决这个具有挑战性的问题,但是我被卡住了,如果有人能帮助我,我将不胜感激

注册定义为事件表中标记为“注册成功”的事件。对于每个城市“A”和“B”以及一周中的每一天,确定2016年第一周导致在注册日期后10小时内完成旅行的注册人数百分比

表名:trips

Column Name                           Datatype
id                                     integer
client_id                              integer (Foreign keyed to 
events.rider_id)
driver_id                              integer
city_id                                Integer (Foreign keyed to 
cities.city_id)
client_rating                          integer
driver_rating                          integer
request_at                             Timestamp with timezone
predicted_eta                          Integer
actual_eta                             Integer
status                                 Enum(‘completed’, 
‘cancelled_by_driver’, ‘cancelled_by_client’)
表名:城市

Column Name   Datatype
city_id        integer
city_name      string
表名称:事件

Column Name     Datatype
device_id        integer
rider_id         integer
city_id          integer
event_name       Enum(‘sign_up_success’, ‘attempted_sign_up’, 
‘sign_up_failure’)
_ts              Timestamp with timezone
在这句话中尝试了一些东西,但是没有接近预期的答案:

SELECT *
FROM trips AS trips
LEFT JOIN cities AS cities ON trips.city_id = cities.city_id
LEFT JOIN events AS events ON events.client_id = events.rider_id
WHERE events.event_name = "sign_up_success"
AND Convert(datetime, trips.request_at') <= Convert(datetime, '2016-01-
07' )
AND DATEDIFF(d, Convert(datetime, events._ts), Convert(datetime, 
trips.request_at)) < 7 days
AND events.status = "completed

有人能帮忙吗。

首先,我假设trips.city\u id是必需的,所以我在加入城市时使用内部连接而不是左连接

然后,要指定字符串常量,需要使用单引号。 查询中还有一些其他更改-希望您自己注意到

此外,查询可能会失败,因为我没有运行它,实际上您没有提供样板SQL

带有“week”第一个参数的date\u trunc函数根据当前时区设置将时间戳转换为相应周的第一天,时间00:00:00,请参阅

我在该值上使用了GROUPBY,分组的第二层是城市ID

此外,我使用了过滤器,其中。。。“计数”旁-只允许对所需行进行计数

最后,我使用CTE来改进查询的结构和可读性

如果它失败了,请告诉我,我会修复它。总的来说,这种方法必须奏效

with data as (
  select
    left(date_trunc('week', t.request_at)::text, 10) as period,
    c.city_id,
    count(distinct t.id) as trips_count,
    count(*) filter (
      where
        e.event_name = 'sign_up_success'
        and e._ts < t.request_at + interval '10 hour'
    ) as successes_count
  from trips as t
  join cities as c on t.city_id = c.city_id
  left join events as e on t.client_id = e.rider_id and e._ts
  where
    t.request_at between '2016-01-01' and '2016-01-08'
  group by 1, 2
)
select
  *,
  round(100 * success_count::numeric / trips_count, 2)::text || '%' as ratio_percent
from data
order by period, city_id
;

首先,我假设trips.city_id是必需的,所以我在加入城市时使用内部连接而不是左连接

然后,要指定字符串常量,需要使用单引号。 查询中还有一些其他更改-希望您自己注意到

此外,查询可能会失败,因为我没有运行它,实际上您没有提供样板SQL

带有“week”第一个参数的date\u trunc函数根据当前时区设置将时间戳转换为相应周的第一天,时间00:00:00,请参阅

我在该值上使用了GROUPBY,分组的第二层是城市ID

此外,我使用了过滤器,其中。。。“计数”旁-只允许对所需行进行计数

最后,我使用CTE来改进查询的结构和可读性

如果它失败了,请告诉我,我会修复它。总的来说,这种方法必须奏效

with data as (
  select
    left(date_trunc('week', t.request_at)::text, 10) as period,
    c.city_id,
    count(distinct t.id) as trips_count,
    count(*) filter (
      where
        e.event_name = 'sign_up_success'
        and e._ts < t.request_at + interval '10 hour'
    ) as successes_count
  from trips as t
  join cities as c on t.city_id = c.city_id
  left join events as e on t.client_id = e.rider_id and e._ts
  where
    t.request_at between '2016-01-01' and '2016-01-08'
  group by 1, 2
)
select
  *,
  round(100 * success_count::numeric / trips_count, 2)::text || '%' as ratio_percent
from data
order by period, city_id
;

向上投票,因为count*过滤器中。。。非常有趣!看起来也不错。但我认为他希望在10小时内取得成功,因此可能会要求间隔10小时。哦,第一周时间戳的下限可能是2016-01-01,这在您的查询中还没有看到。在那个时间点之前可能有数据。但是这些只是细节。顺便问一下,你为什么要使用不同的t.id?t.id上会出现重复吗?如果是,删除重复项会影响计算的百分比吗?两个都应该是不同的还是完全没有?我想每次旅行都会发生多个事件。谢谢@Nick的精彩工作。我需要一些时间来消化这些信息。不幸的是,我只有模式,没有数据。但是,我希望它能起作用。投票率上升,因为count*过滤器在哪里。。。非常有趣!看起来也不错。但我认为他希望在10小时内取得成功,因此可能会要求间隔10小时。哦,第一周时间戳的下限可能是2016-01-01,这在您的查询中还没有看到。在那个时间点之前可能有数据。但是这些只是细节。顺便问一下,你为什么要使用不同的t.id?t.id上会出现重复吗?如果是,删除重复项会影响计算的百分比吗?两个都应该是不同的还是完全没有?我想每次旅行都会发生多个事件。谢谢@Nick的精彩工作。我需要一些时间来消化这些信息。不幸的是,我只有模式,没有数据。但是,我希望它能起作用。