Sql Postgres:无法确定以完成行程结束的成功事件的百分比
SQL专家, 在我练习SQL技能的过程中,我试图解决这个具有挑战性的问题,但是我被卡住了,如果有人能帮助我,我将不胜感激 注册定义为事件表中标记为“注册成功”的事件。对于每个城市“A”和“B”以及一周中的每一天,确定2016年第一周导致在注册日期后10小时内完成旅行的注册人数百分比 表名:tripsSql Postgres:无法确定以完成行程结束的成功事件的百分比,sql,postgresql,Sql,Postgresql,SQL专家, 在我练习SQL技能的过程中,我试图解决这个具有挑战性的问题,但是我被卡住了,如果有人能帮助我,我将不胜感激 注册定义为事件表中标记为“注册成功”的事件。对于每个城市“A”和“B”以及一周中的每一天,确定2016年第一周导致在注册日期后10小时内完成旅行的注册人数百分比 表名:trips Column Name Datatype id integer clien
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的精彩工作。我需要一些时间来消化这些信息。不幸的是,我只有模式,没有数据。但是,我希望它能起作用。