我其实不是特别理解有两个点:
1、我这个代码输出的结果里面,第一行是null。但是我临时表1是输出的不同的2023月份,第二章合并表用的inner join,第三个临时表只是新增一列,应该不会出现null值
2、我第一个表中distinct 月份,然后第三章表进行左连接,4月份还掉了?按理来说date_table应该是完整的月份呀,不会出现这么大的误差的。
with date_summary as (
select
distinct date_format(date_value,'%Y-%m') as trx_mon
from
date_table
where
year(date_value)=2023
),
monthly_sum_trx_amt as (
select
substr(trx_time,1,7) as trx_mon
,sum(trx_amt) as month_trx_amt
from
cmb_usr_trx_rcd as u
inner join
cmb_mch_typ as m
using (mch_nm)
where
usr_id=5201314520
and mch_typ='休闲娱乐'
and year(trx_time)=2023
group by
substr(trx_time,1,7)
),
total_sum_trx_amt as (
select
m1.trx_mon
,coalesce(month_trx_amt,0) as month_trx_amt
,sum(month_trx_amt)over(order by m1.trx_mon ) as trx_amt
from
date_summary as d1
left join
monthly_sum_trx_amt as m1
on d1.trx_mon=m1.trx_mon
)
select
trx_mon
,trx_amt
from
total_sum_trx_amt
order by
trx_mon
with math_rank as (
select
student_id
,case when
score>=110 then '[110, 120]'
when
score between 90 and 109 then '[90, 110)'
when
score between 60 and 89 then '[60, 90)'
else '[0, 60)'
end as score_range
from
scores
where
exam_date='2024-06-30'
and subject='数学')
select
score_range
,count(*) as num_students
from
math_rank
group by
score_range
这个地方我输出的结果也是一样的,但是跟他排序不同。我想知道在这种情况下需要怎么排序,才能排成答案这种。
select
name
,subject
,class_code
,qualification
from
teachers
where
fir_degr rlike '北京大学|清华大学'
and head_teacher is not null
order by
name asc
我用正则表达式进行匹配为什么不对
select
st.student_id
,st.name
,sc.score
,row_number()over(order by sc.score desc) as rnk
from
students as st
inner join
scores as sc
on st.student_id=sc.student_id
where
st.grade_code='S1'
and sc.subject='物理'
ORDER BY
rnk,st.student_id
limit
10
就我这个也能输出排名前十,但是跟答案不一样,我筛选的条件也是s1学物理的
上一题中代码里面用的count计数,然后在临时表里没有group by,后面调用的时候进行分组。但是我在这个题中我在第二个计算各个类型频次表里,用count代替sum计数,然后我对日期和这几个count分组,输出不了结果,我不太明白为什么。
with quarterly_transactions as (
select
*,
concat(year(trx_time), '-', 'Q', quarter(trx_time)) as trx_quarter, /* 提取交易日期的年份和季度 */
count(case when trx_amt = 288 then trx_amt else null end) over (order by concat(year(trx_time), '-', 'Q', quarter(trx_time))) as withhand, /* 计算金额为 288 的交易次数,并按季度累积 */
count(case when trx_amt = 888 then trx_amt else null end) over (order by concat(year(trx_time), '-', 'Q', quarter(trx_time))) as doi /* 计算金额为 888 的交易次数,并按季度累积 */
from
cmb_usr_trx_rcd
where
usr_id = 5201314520 /* 限制查询结果只包含特定用户的交易记录 */ and mch_nm='红玫瑰按摩保健休闲'
and year(trx_time) in (2023,2024)
)
select
trx_quarter,
withhand,
doi
from
quarterly_transactions
group by
trx_quarter,
withhand,
doi /* 按季度分组,并选择累积的交易次数 */
order by
trx_quarter; /* 按季度排序 */
sum case when 和count case when绝大多数情况下都是可以等价互换的,你再试试是不是其他条件漏写啦
select
substr(DATE_FORMAT(trx_time, '%Y-%m-%d'),1,7) as trx_mon
,max(last_day(trx_time)) as last_day
from
cmb_usr_trx_rcd
where
year(trx_time) in (2023,2024)
group by
substr(DATE_FORMAT(trx_time, '%Y-%m-%d'),1,7)
order by
trx_mon
我想问一个语法方面的问题,就是有了group分组之后,是不是输出的列也是要聚合好的。我一开始lastday那里没有加max,就是无法输出。
select a,b from t group by a会报错的;select a, max(b) from t group by a不会报错。你的语句不加max,就是犯了第一种错
select
trx_amt
,count(trx_amt) as total_trx_cnt
,count(distinct usr_id) as unique_usr_cnt
,count(trx_amt)/count(distinct usr_id) as avg_trx_per_user
from cmb_usr_trx_rcd
where mch_nm='红玫瑰按摩保健休闲'
and year(trx_time)=2023 and month(trx_time) in (1,2,3,4,5,6,7,8,9,10,11,12)
or year(trx_time)=2024 and month(trx_time) in (1,2,3,4,5,6)
group by trx_amt
order by avg_trx_per_user desc
limit 5
我输出的结果中total_trx_cnt 数量不对,288.888,1288都多了两个
WITH daily_unique_logins AS (
SELECT
usr_id,
DATE(login_time) AS login_date
FROM
user_login_log
WHERE
login_time >= DATE_SUB(CURDATE(), INTERVAL 90 DAY)
GROUP BY
usr_id,
DATE(login_time)
),
retention_days AS (
SELECT
dul1.usr_id,
dul1.login_date AS first_login_date,
dul2.login_date AS next_day_login_date,
DATEDIFF(dul2.login_date, dul1.login_date) AS days_diff
FROM
daily_unique_logins dul1
LEFT JOIN
daily_unique_logins dul2
ON
dul1.usr_id = dul2.usr_id AND
dul2.login_date BETWEEN dul1.login_date + INTERVAL 1 DAY AND dul1.login_date + INTERVAL 14 DAY
)
SELECT
first_login_date,
ROUND(COUNT(DISTINCT CASE WHEN days_diff BETWEEN 1 AND 3 THEN usr_id END) * 100.0 / COUNT(DISTINCT usr_id), 2) AS t_plus_3_retention_rate,
ROUND(COUNT(DISTINCT CASE WHEN days_diff BETWEEN 1 AND 7 THEN usr_id END) * 100.0 / COUNT(DISTINCT usr_id), 2) AS t_plus_7_retention_rate,
ROUND(COUNT(DISTINCT CASE WHEN days_diff BETWEEN 1 AND 14 THEN usr_id END) * 100.0 / COUNT(DISTINCT usr_id), 2) AS t_plus_14_retention_rate
FROM
retention_days
WHERE
first_login_date >= DATE_SUB(CURDATE(), INTERVAL 90 DAY)
GROUP BY
first_login_date
ORDER BY
first_login_date;
WITH daily_unique_logins AS (
SELECT
usr_id,
DATE(login_time) AS login_date
FROM
user_login_log
WHERE
login_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY
usr_id,
DATE(login_time)
),
retention_days AS (
SELECT
dul1.usr_id,
dul1.login_date AS first_login_date,
dul2.login_date AS next_day_login_date,
DATEDIFF(dul2.login_date, dul1.login_date) AS days_diff
FROM
daily_unique_logins dul1
LEFT JOIN
daily_unique_logins dul2
ON
dul1.usr_id = dul2.usr_id AND
dul2.login_date BETWEEN dul1.login_date + INTERVAL 1 DAY AND dul1.login_date + INTERVAL 14 DAY
)
SELECT
first_login_date,
ROUND(COUNT(DISTINCT CASE WHEN days_diff = 1 THEN usr_id END) * 100.0 / COUNT(DISTINCT usr_id), 2) AS t_plus_1_retention_rate,
ROUND(COUNT(DISTINCT CASE WHEN days_diff = 3 THEN usr_id END) * 100.0 / COUNT(DISTINCT usr_id), 2) AS t_plus_3_retention_rate,
ROUND(COUNT(DISTINCT CASE WHEN days_diff = 7 THEN usr_id END) * 100.0 / COUNT(DISTINCT usr_id), 2) AS t_plus_7_retention_rate,
ROUND(COUNT(DISTINCT CASE WHEN days_diff = 14 THEN usr_id END) * 100.0 / COUNT(DISTINCT usr_id), 2) AS t_plus_14_retention_rate
FROM
retention_days
WHERE
first_login_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY
first_login_date
ORDER BY
first_login_date;
with data1 as (
select
usr_id
,date(login_time) as login_date
from
user_login_log
where
datediff(current_date,date(login_time))<=30
group by
1,2
),
data2 as (
select
T.usr_id
,T.login_date as T_date
,T_1.login_date as T_1_date
from
data1 as T
left join
data1 as T_1
on
T.usr_id = T_1.usr_id
and datediff(T.login_date, T_1.login_date) = -1
)
select
T_date as first_login_date,
concat(round(avg(T_1_date is not null)*100, 2), '%') as T1_retention_rate
from
data2
group by
T_date
order by
T_date;
with friend_steps as (
select
t1.user1 as user_id
,t1.user2 as friend_id
,t2.steps
from
friend_relationships as t1
inner join
user_steps as t2
on t1.user2=t2.user_id
union
select
user_id
,user_id as friend_id
,steps
from
user_steps
),
ranked_steps as (
select
fs.user_id
,fs.friend_id
,fs.steps
,rank()over(partition by fs.user_id order by fs.steps desc) as row_num
from
friend_steps fs
)
select
rs.user_id
,rs.row_num
from
ranked_steps rs
where
rs.user_id=rs.friend_id
withfriend_summary1 as (
select
f.user1
,f.user2
,u.steps as steps2
from
friend_relationships as f
inner join
user_steps as u
on f.user2=u.user_id
),
friend_summary2 as (
select
f.user1
,f.user2
,f.steps2
,u.steps as steps1
from
friend_summary1 as f
inner join
user_steps as u
on f.user1=u.user_id
)
select
user1
,sum(case when steps2<steps1 then 0 else 1 end)+1 as num
from
friend_summary2
group by
user1
select
t2.live_id
,t2.live_nm
,count(usr_id) as enter_cnt
from
ks_live_t2 as t2
left join
ks_live_t1 as t1
using(live_id)
where
(substr(enter_time,1,10)='2021-09-12' and hour(enter_time)=23)
group by
t2.live_id
,t2.live_nm
order by
enter_cnt desc
limit
5
select
t2.live_id
,t2.live_nm
,count(usr_id) as enter_cnt
from
ks_live_t2 as t2
left join
ks_live_t1 as t1
using(live_id)
where
(substr(enter_time,1,10)='2021-09-12' and hour(enter_time)=23)
group by
t2.live_id
,t2.live_nm
order by
enter_cnt desc
with monthly_trx as (
select
date_format(t.trx_time, '%Y-%m') as trx_mon,
sum(t.trx_amt) as monthly_trx_amt
from
cmb_usr_trx_rcd t
join
cmb_mch_typ m on t.mch_nm = m.mch_nm
where
t.usr_id = 5201314520
and m.mch_typ = '休闲娱乐'
and year(t.trx_time) between 2023 and 2024
group by
trx_mon
order by
trx_mon
),
cumulative_trx as (
select
trx_mon,
monthly_trx_amt,
sum(monthly_trx_amt) over ( order by trx_mon) as cumulative_trx_amt
from
monthly_trx
)
select
trx_mon,
cumulative_trx_amt as trx_amt
from
cumulative_trx
order by
trx_mon;
WITH date_summary AS (
SELECT DISTINCT DATE_FORMAT(date_value, '%Y-%m') AS trx_mon
FROM date_table
WHERE DATE_FORMAT(date_value, '%Y-%m') BETWEEN '2023-01' AND '2024-06'
),
mch_summary AS (
SELECT
u.usr_id,
u.mch_nm,
u.trx_time,
DATE_FORMAT(u.trx_time, '%Y-%m-%d') AS trx_date,
u.trx_amt,
m.mch_typ
FROM
cmb_usr_trx_rcd AS u
LEFT JOIN
cmb_mch_typ AS m ON u.mch_nm = m.mch_nm
WHERE
u.usr_id = 5201314520
AND DATE_FORMAT(u.trx_time, '%Y-%m') BETWEEN '2023-01' AND '2024-06'
AND (m.mch_typ = '休闲娱乐' OR m.mch_typ IS NULL)
AND u.trx_amt >= 288
AND HOUR(u.trx_time) IN (23, 0, 1, 2)
),
total_summary AS (
SELECT
d.trx_mon,
COALESCE(LAST_DAY(MAX(m1.trx_time)), '1900-01-01') AS last_day,
COALESCE(DAY(LAST_DAY(MAX(m1.trx_time))), 0) AS day_of_mon,
COALESCE(SUM(m1.trx_amt), 0) AS trx_amt,
COALESCE(COUNT(m1.trx_amt), 0) AS trx_cnt,
COALESCE(ROUND(SUM(m1.trx_amt) / DAY(LAST_DAY(MAX(m1.trx_time))), 2), 0) AS avg_day_amt,
COALESCE(ROUND(COUNT(m1.trx_amt) / DAY(LAST_DAY(MAX(m1.trx_time))), 2), 0) AS avg_day_cnt
FROM
date_summary AS d
LEFT JOIN
mch_summary AS m1 ON d.trx_mon = DATE_FORMAT(m1.trx_time, '%Y-%m')
GROUP BY
d.trx_mon
)
SELECT
trx_mon,
last_day,
day_of_mon,
trx_amt,
trx_cnt,
avg_day_amt,
avg_day_cnt
FROM
total_summary
ORDER BY
trx_mon;
select
substr(u.trx_time,1,7) as trx_mon
,max(last_day(u.trx_time)) as last_day
,day(max(last_day(u.trx_time))) as days_of_mon
,sum(u.trx_amt) as trx_amt
,count(u.trx_amt) as trx_cnt
,sum(u.trx_amt)/day(max(last_day(u.trx_time))) as avg_day_amt
,count(u.trx_amt)/day(max(last_day(u.trx_time))) as avg_day_cnt
from
cmb_usr_trx_rcd as u
inner join
cmb_mch_typ as m
using (mch_nm)
where
u.usr_id=5201314520
and year(u.trx_time) in('2023','2024')
and m.mch_typ='休闲娱乐'
group by
substr(u.trx_time,1,7)
order by
trx_mon
select
substr(u.trx_time,1,7) as trx_mon
,max(last_day(u.trx_time)) as last_day
,day(max(last_day(u.trx_time))) as days_of_mon
from
cmb_usr_trx_rcd as u
inner join
cmb_mch_typ as m
using (mch_nm)
where
u.usr_id=5201314520
and year(u.trx_time) in('2023','2024')
and m.mch_typ='休闲娱乐'
group by
substr(u.trx_time,1,7)
order by
trx_mon
SELECT
m.mch_typ,
u.mch_nm,
COUNT(u.trx_amt) AS trx_cnt,
SUM(u.trx_amt) AS trx_amt
FROM
cmb_usr_trx_rcd u
LEFT JOIN
cmb_mch_typ m ON u.mch_nm = m.mch_nm
WHERE
u.usr_id = '5201314520' and left(trx_time,4)=2024
and m.mch_typ is null
GROUP BY
m.mch_typ,
u.mch_nm
ORDER BY
3 DESC