平均活跃天数和月活人数(sql练习)

用户在牛客试卷作答区作答记录存储在表exam_record中,内容如下:

exam_record表(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分)

id uid exam_id start_time submit_time score
1 1001 9001 2021-07-02 09:01:01 2021-07-02 09:21:01 80
2 1002 9001 2021-09-05 19:01:01 2021-09-05 19:40:01 81
3 1002 9002 2021-09-02 12:01:01 (NULL) (NULL)
4 1002 9003 2021-09-01 12:01:01 (NULL) (NULL)
5 1002 9001 2021-07-02 19:01:01 2021-07-02 19:30:01 82
6 1002 9002 2021-07-05 18:01:01 2021-07-05 18:59:02 90
7 1003 9002 2021-07-06 12:01:01
### 关于SQL窗口函数的经典练习题或面试题 #### 使用窗口函数获取员工薪资排名 为了展示如何使用窗口函数,下面是一个经典的例子:假设有一个`employees`表,其中包含员工编号(`employee_id`)、姓名(`name`)以及工资(`salary`)字段。现在需求是从该表中查询每位员工在其部门内的工资排名。 ```sql SELECT employee_id, name, salary, department_id, DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_salary FROM employees; ``` 此查询利用了`DENSE_RANK()`窗口函数[^1],它会根据指定条件(这里是按部门划分并通过工资降序排列)分配连续的排名给每一行记录;如果存在相同名次,则后续名次不会跳过。通过这种方式可以直观了解各个成员所在团队内部薪酬水平的位置关系。 #### 计算累计销售额 另一个常见的应用场景是在销售数据分析领域内计算某段时间里每日累积销量变化情况: ```sql WITH sales_data AS ( SELECT sale_date, SUM(sales_amount) AS daily_sales FROM sales_table GROUP BY sale_date ) SELECT sale_date, daily_sales, SUM(daily_sales) OVER (ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sales FROM sales_data; ``` 这里先创建了一个名为`samples_data`的CTE(公用表表达式),用来汇总每天总的销售收入[`daily_sales`]。接着在外层查询部分应用了带有框架子句定义的时间序列累加运算——即从最开始到当前日期为止所有天数上的总作为当日结束时刻点上已实现的整体业绩表现指标之一【cumulative_sales】[^2]。 #### 获取最近一次登录时间 对于用户行为追踪类业务系统而言,有时需要知道特定客户群体最后一次访问平台的具体时刻。此时可借助LAG/LEAD这类前后偏移量型窗口功能来达成目标: ```sql SELECT user_id, login_time, LAG(login_time, 1) OVER(PARTITION BY user_id ORDER BY login_time ASC) as previous_login FROM logins; ``` 上述脚本中的`LAG()`函数允许我们向前查看一行的数据,在这个案例下就是指同一用户的前一条登陆日志条目。这样便能轻松对比相邻两次动间隔长短从而分析活跃度趋势等特征[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值