1)有两张表,一张是用户表,一张是用户访问行为表,字段如下:用户表:user_id,gender, birthday user_idgender birthday 1 F 1993-03-17 2 M 1998-10-10 访问行为表:access_time, user_id,user_action access_time user_id user_action 2020-01-01 1 A 2020-01-01 1 B 2020-01-02 2 B 用SQL语言计算以下统计指标: 1.计算90后-95后用户,每天的用户数和平均访问次数 2. 计算每日新增用户数 3. 计算连续两天都有访问行为的用户数
时间: 2024-03-23 12:36:21 浏览: 51
1. 计算90后-95后用户,每天的用户数和平均访问次数
可以使用以下SQL语句来实现:
```
SELECT
a.access_time AS visit_date,
COUNT(DISTINCT u.user_id) AS daily_user_num,
COUNT(a.user_action) / COUNT(DISTINCT u.user_id) AS avg_visit_num
FROM user_table u
JOIN access_behavior_table a ON u.user_id = a.user_id
WHERE u.birthday BETWEEN '1990-01-01' AND '1995-12-31'
GROUP BY a.access_time
```
该语句使用了JOIN操作,将两张表按照user_id字段进行连接,然后使用WHERE子句选择了生日在1990年至1995年之间的用户。使用GROUP BY子句按照访问时间access_time进行分组,然后使用COUNT和DISTINCT关键字计算每天的用户数和平均访问次数。
2. 计算每日新增用户数
可以使用以下SQL语句来实现:
```
SELECT
a.access_time AS visit_date,
COUNT(DISTINCT a.user_id) AS new_user_num
FROM access_behavior_table a
LEFT JOIN access_behavior_table b ON a.user_id = b.user_id AND a.access_time > b.access_time
WHERE b.user_id IS NULL
GROUP BY a.access_time
```
该语句使用了LEFT JOIN操作,将访问行为表按照user_id字段进行自连接,然后使用WHERE子句选择了在a表中存在,在b表中不存在的记录,也就是新增用户。使用GROUP BY子句按照访问时间access_time进行分组,然后使用COUNT和DISTINCT关键字计算每天的新增用户数。
3. 计算连续两天都有访问行为的用户数
可以使用以下SQL语句来实现:
```
SELECT COUNT(DISTINCT user_id) AS user_num
FROM (
SELECT
user_id,
DATEDIFF(access_time, '1970-01-01') AS visit_days,
DENSE_RANK() OVER(PARTITION BY user_id ORDER BY access_time) AS visit_rank
FROM access_behavior_table
) t
WHERE visit_rank > 1 AND visit_days - visit_rank + 1 = DATEDIFF(access_time, '1970-01-01')
```
该语句使用了子查询和窗口函数,子查询将访问行为表中的access_time字段转换为距离1970年1月1日的天数,使用窗口函数对每个用户的访问时间进行排序并分配排名,然后在外部查询中筛选出连续两天访问行为的用户,并使用COUNT和DISTINCT关键字计算用户数量。
阅读全文