with data1 as (
select distinct usr_id,
date(login_time) as login_date
from user_login_log
),
data2 as (
select usr_id,
login_date,
first_value(login_date) over (partition by usr_id order by login_date) as `start_date`,
lag(login_date) over (partition by usr_id order by login_date) as `pre_date`
from data1
),
data3 as (
select distinct data1.usr_id,
data1.login_date,
case
when pre_date is null and datediff(data1.login_date,start_date) = 0 then 'flag-1'
when pre_date is not null and datediff(data1.login_date,pre_date) <= 3 then 'flag-2'
else 'flag-3'
end as flag
from data1
left join data2
on (data1.usr_id,data1.login_date) = (data2.usr_id,data2.login_date)
),
data4 as (
select login_date,
round((sum(if(flag = 'flag-1', 1, 0)) / count(1)) * 100, 2) as rate_flag_1,
round((sum(if(flag = 'flag-2', 1, 0)) / count(1)) * 100, 2) as rate_flag_2,
round((sum(if(flag = 'flag-3', 1, 0)) / count(1)) * 100, 2) as rate_flag_3
from data3
group by login_date
)
select login_date,
concat_ws(',', rate_flag_1, rate_flag_2, rate_flag_3) as pct
from data4
where year(login_date) = '2024'
group by login_date
order by login_date;
求指点这个思路的错误呀,一直是0过不去
select
distinct
usr_id
from(
select
usr_id,
login_date,
lag(login_date,3)over(partition by usr_id order by login_date) as pre_date
from(
select
usr_id,
date_format(trx_time,'%Y-%m-%d') as login_date
from cmb_usr_trx_rcd
where mch_nm = '红玫瑰按摩保健休闲'
)a
)b
where datediff(login_date,pre_date) <= 3
order by usr_id asc;
select
usr_id
from(
select
usr_id,
login_date,
lag(login_date,3)over(partition by usr_id order by login_date) as pre_date
from(
select
usr_id,
date_format(trx_time,'%Y-%m-%d') as login_date
from cmb_usr_trx_rcd
where mch_nm = '红玫瑰按摩保健休闲'
)a
)b
where datediff(login_date,pre_date) <= 2
order by usr_id asc;
select
usr_id
from(
select
usr_id,
login_date,
lag(login_date,3)over(partition by usr_id order by login_date) as pre_date
from(
select
usr_id,
date_format(trx_time,'%Y-%m-%d') as login_date
from cmb_usr_trx_rcd
where mch_nm = '红玫瑰按摩保健休闲'
)a
)b
where datediff(login_date,pre_date) <= 3
order by usr_id asc;
select
c.live_id,
live_nm,
max_online_users
from(
select
live_id,
max(cur_cnt) as max_online_users
from(
select
live_id,
user_time,
sum(flag) over(partition by live_id order by user_time) as cur_cnt
from (
select
live_id,
enter_time as user_time,
1 as flag
from ks_live_t1
union all
select
live_id,
leave_time as user_time,
-1 as flag
from ks_live_t1
)a
)b
group by live_id
)c
left join ks_live_t2 t2
on c.live_id = t2.live_id
order by max_online_users desc;
select
t1.live_id,
live_nm,
count(1) as online_users
from ks_live_t1 t1
join ks_live_t2 t2
on t1.live_id = t2.live_id
where enter_time <= '2021-09-12 23:48:38' and leave_time >= '2021-09-12 23:48:38'
group by live_id,live_nm
order by online_users desc;
select
t1.live_id,
live_nm,
count(1) as online_users
from ks_live_t1 t1
join ks_live_t2 t2
on t1.live_id = t2.live_id
where enter_time <= '2021-09-12 11:48:38' and leave_time >= '2021-09-12 11:48:38'
group by live_id,live_nm
order by online_users desc;
select
distinct
usr_id
from(
select
usr_id,
trx_time,
lag(trx_time,3)over(partition by usr_id order by trx_time) as pre_time
from cmb_usr_trx_rcd
where mch_nm = '红玫瑰按摩保健休闲'
)a
where datediff(trx_time,pre_time) <= 3
order by usr_id;
select
distinct
usr_id
from(
select
usr_id,
trx_time,
lag(trx_time,3)over(partition by usr_id order by trx_time) as pre_time
from cmb_usr_trx_rcd
where mch_nm = '红玫瑰按摩保健休闲'
)a
where datediff(trx_time,pre_time) <= 4
order by usr_id;
select
usr_id
from(
select
usr_id,
trx_time,
lag(trx_time,3)over(partition by usr_id order by trx_time) as pre_time
from cmb_usr_trx_rcd
where mch_nm = '红玫瑰按摩保健休闲'
)a
where datediff(trx_time,pre_time) <= 4
order by usr_id;
select
live_id,
live_nm,
max(cur_cnt) as max_online_users
from(
select
a.live_id,
t2.live_nm,
flag_time,
flag,
sum(flag) over(partition by live_id order by flag_time) as cur_cnt
from(
select
live_id,
enter_time as flag_time,
1 as flag
from ks_live_t1
union all
select
live_id,
leave_time as flag_time,
-1 as flag
from ks_live_t1
)a
left join ks_live_t2 t2 on a.live_id = t2.live_id
)b
group by live_id, live_nm
order by max_online_users desc;
select
t1.live_id,
live_nm,
count(*) as online_users
from ks_live_t1 t1
left join ks_live_t2 t2
on t1.live_id = t2.live_id
where date_format(t1.enter_time,'%Y-%m-%d %H:%i:%s') <= '2021-09-12 23:48:38' and date_format(t1.leave_time,'%Y-%m-%d %H:%i:%s') >= '2021-09-12 23:48:38'
group by live_id,live_nm
order by online_users desc;
select
live_id,
live_nm,
live_type,
total_duration,
total_users,
avg_duration
from(
select
live_id,
live_nm,
live_type,
total_duration,
total_users,
avg_duration,
row_number()over(partition by live_type order by avg_duration desc) as rn
from(
select
t1.live_id,
live_nm,
live_type,
sum(timestampdiff(SECOND,t1.enter_time,t1.leave_time)) as total_duration,
count(*) as total_users,
sum(timestampdiff(SECOND,t1.enter_time,t1.leave_time))/count(*) as avg_duration
from ks_live_t1 t1
left join ks_live_t2 t2
on t1.live_id = t2.live_id
where date_format(t1.enter_time, '%Y-%m-%d %H') >= '2021-09-12 23' and date_format(t1.leave_time, '%Y-%m-%d %H') <= '2021-09-13 04'
group by live_id,live_nm,live_type
)a
)b
where rn = 1
order by live_id asc;
select
live_id,
live_nm,
live_type,
enter_cnt
from(
select
live_id,
live_nm,
live_type,
enter_cnt,
row_number()over(partition by live_type order by enter_cnt desc) as rn
from(
select
t1.live_id,
live_nm,
live_type,
count(*) as enter_cnt
from ks_live_t1 t1
left join ks_live_t2 t2
on t1.live_id = t2.live_id
where date_format(enter_time,'%Y-%m-%d %H') = '2021-09-12 23'
group by live_id,live_nm,live_type
)a
)b
where rn = 1
order by live_id asc;
select
live_id,
live_nm,
live_type,
enter_cnt
from(
select
live_id,
live_nm,
live_type,
enter_cnt,
row_number()over(partition by live_id order by enter_cnt desc) as rn
from(
select
t1.live_id,
live_nm,
live_type,
count(*) as enter_cnt
from ks_live_t1 t1
left join ks_live_t2 t2
on t1.live_id = t2.live_id
where date_format(enter_time,'%Y-%m-%d %H') = '2021-09-12 23'
group by live_id,live_nm,live_type
)a
)b
where rn = 1
order by live_id asc;
select t1.live_id,
live_nm,
count(*) as enter_cnt
from ks_live_t1 t1
left join ks_live_t2 t2 on t1.live_id=t2.live_id
where DATE_FORMAT(t1.enter_time,'%Y-%m-%d %H') = '2021-09-12 23'
group by live_id,live_nm
order by enter_cnt desc
limit 5;
select t1.live_id,
live_nm,
count(*) as enter_cnt
from ks_live_t1 t1
left join ks_live_t2 t2 on t1.live_id=t2.live_id
where DATE_FORMAT(t1.enter_time,'%Y-%m-%d %H') <= '2021-09-12 23' and DATE_FORMAT(t1.enter_time,'%Y-%m-%d %H') >='2021-09-12 23'
group by live_id,live_nm;
select
lpad(hour_entered,2,'0') as hour_entered,
cnt as hour_entered
from(
select
hour(enter_time) as hour_entered,
count(*) as cnt
from ks_live_t1 t1
left join ks_live_t2 t2
ont1.live_id = t2.live_id
group by hour(enter_time)
)a
order by hour_entered;
with a as(
select
live_id,
`enter_time` as action_time,
1 as flag
from ks_live_t1
union all
select
live_id,
leave_time as action_time,
-1 as flag
from ks_live_t1
),
b as (
select
live_id,
action_time,
sum(flag) over(partition by live_id order by action_time) as prelive_pretime_cnt
from a
),
c as(
select
live_id,
action_time,
prelive_pretime_cnt,
max(prelive_pretime_cnt)over(partition by live_id) as target
from b
),
d as (
select
live_id,
target as max_online_users,
min(action_time) as first_peak_time,
max(action_time) as last_peak_time
from c
where prelive_pretime_cnt = target
group by live_id,target
)
select
d.live_id,
ks_live_t2.live_nm,
max_online_users,
first_peak_time,
last_peak_time
from d
left join ks_live_t2 on d.live_id = ks_live_t2.live_id;
WITH UserActivity AS (
SELECT
t1.usr_id,
t1.live_id,
t1.enter_time AS event_time,
1 AS act
FROM
ks_live_t1 t1
UNION ALL
SELECT
t1.usr_id,
t1.live_id,
t1.leave_time AS event_time,
-1 AS act
FROM
ks_live_t1 t1
),
CumulativeOnline AS (
SELECT
live_id,
event_time,
SUM(act) OVER (PARTITION BY live_id ORDER BY event_time) AS online_users
FROM
UserActivity
),
PeakOnline AS (
SELECT
live_id,
event_time,
online_users,
MAX(online_users) OVER (PARTITION BY live_id) AS max_online_users
FROM
CumulativeOnline
),
PeakTimes AS (
SELECT
live_id,
event_time AS peak_time,
max_online_users
FROM
PeakOnline
WHERE
online_users = max_online_users
)
SELECT
pt.live_id,
t2.live_nm,
pt.max_online_users
FROM
PeakTimes pt
JOIN
ks_live_t2 t2
ON
pt.live_id = t2.live_id
GROUP BY
pt.live_id,
t2.live_nm,
pt.max_online_users
ORDER BY
pt.max_online_users DESC;