首页 > 其他分享 >窗口函数

窗口函数

时间:2023-11-10 11:34:56浏览次数:31  
标签:exam 01 窗口 uid 试卷 2021 time 函数

前言

见这种近几、连续、每类前几、各个前几直接考虑窗口函数,这里说下常用的几个: 窗口函数语法都是一样的: <窗口函数> OVER (partition by <用于分组的列名> order by <用于排序的列名>)

序号函数:row_number、rank、dense_rank

例如:对100,99,99,85,84 row_number的进行排序结果是:1、 2、 3、 4 、5 rank的排序结果是:1、2、2、4、5 dense_rank的排序结果是:1、2、2、3、4 ROW_NUMBER()函数可以理解为排序号,不考虑并列; RANK()函数也为排号,考虑并列,并列之后的按照实际序号来; dense_rank()同样是排号,考虑并列,并列之后按下一个名次来。         1)窗口函数:有三种排序方式
  • rank() over() 1 2 2 4 4 6  (计数排名,跳过相同的几个,eg.没有3没有5)
  • row_number() over() 1 2 3 4 5 6 (赋予唯一排名)
  • dense_rank() over() 1 2 2 3 3 4 (不跳过排名,可以理解为对类别进行计数)
2)求时间差函数  timestampdiff(时间格式,开始时间,结束时间)  

题目

例一

找到每类试卷得分的前3名,如果两人最大分数相同,选择最小分数大者,如果还相同,选择uid大者。由示例数据结果输出如下:
tid uid ranking
SQL 1003 1
SQL 1004 2
SQL 1002 3
算法 1005 1
算法 1006 2
算法 1003 3
  试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间)
id exam_id tag difficulty duration release_time
  试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分)
id uid exam_id start_time submit_time score
  知识点:where不可以引用select里面as 的变量,如果想用需要重新select
select
    tag,
    uid,
    ranking
from(
    SELECT
    a.tag,
    b.uid,
    ROW_NUMBER() OVER (
        PARTITION BY
            tag
        ORDER BY
            max(b.score) DESC,
            min(b.score) DESC,
            b.uid DESC
    ) ranking
FROM
    examination_info a
    LEFT JOIN exam_record b ON a.exam_id = b.exam_id
GROUP BY
    a.tag,
    b.uid
)t1
where ranking<=3

例二

现有试卷作答记录表exam_record(uid:用户ID, exam_id:试卷ID, start_time:开始作答时间, submit_time:交卷时间,为空的话则代表未完成, score:得分):
id uid exam_id start_time submit_time score
1 1006 9003 2021-09-06 10:01:01 2021-09-06 10:21:02 84
2 1006 9001 2021-08-02 12:11:01 2021-08-02 12:31:01 89
3 1006 9002 2021-06-06 10:01:01 2021-06-06 10:21:01 81
4 1006 9002 2021-05-06 10:01:01 2021-05-06 10:21:01 81
5 1006 9001 2021-05-01 12:01:01 (NULL) (NULL)
6 1001 9001 2021-09-05 10:31:01 2021-09-05 10:51:01 81
7 1001 9003 2021-08-01 09:01:01 2021-08-01 09:51:11 78
8 1001 9002 2021-07-01 09:01:01 2021-07-01 09:31:00 81
9 1001 9002 2021-07-01 12:01:01 2021-07-01 12:31:01 81
10 1001 9002 2021-07-01 12:01:01 (NULL) (NULL)
  找到每个人近三个有试卷作答记录的月份中没有试卷是未完成状态的用户的试卷作答完成数,按试卷完成数和用户ID降序排名。由示例数据结果输出如下:   剔除在3个月中有未完成状态试卷的用户,即作答数=完成数
uid exam_complete_cnt
1006 3
  解释:用户1006近三个有作答试卷的月份为202109、202108、202106,作答试卷数为3,全部完成;用户1001近三个有作答试卷的月份为202109、202108、202107,作答试卷数为5,完成试卷数为4,因为有未完成试卷,故过滤掉。  
SELECT uid,(①) 'exam_complete_cnt' --题设要求输出
FROM(②) A --FROM()内填充排序函数
WHERE(③) --用于筛选近三个月
GROUP BY uid --对每位用户
HAVING(④) --用于过滤近三个月有未完成试卷的用户
ORDER BY exam_complete_cnt DESC,uid DESC;
 
select uid,count(1)
count(1)会查询(去重后)所有uid
select uid,count(score)
count(score)会查询分数不为空或者0的uid
知识点: 窗口函数里的order by 是不能用别名的 timestampdiff(minute , start_time ,submit_time ) AS time_diff

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

             

标签:exam,01,窗口,uid,试卷,2021,time,函数
From: https://www.cnblogs.com/chen02/p/17823706.html

相关文章

  • C++函数分文件编写
    1、创建.h后缀名的头文件并且声明需要调用的函数,并且给出通用输出流和输出流#include<iostream>usingnamespacestd;voidasd();2、创建.cpp后缀名的源文件并且调用刚刚定义的头文件#include"asd.h"voidasd(){ cout<<"HelloWorld!"<<endl;}3、在源文件中......
  • 命令文件后台运行即隐藏黑窗口
    win系统下第一种方法:bat后台运行https://www.cnblogs.com/sheng-247/p/10528160.html直接让bat窗口在后台运行,在你的bat脚本最开始加上这三行:if"%1"=="hide"gotoCmdBeginstartmshtavbscript:createobject("wscript.shell").run("""%~0""......
  • 把损失函数变成图片
    epochs=list(range(1,num_epochs+1))train_losses=[]#用于存储每个epoch的训练损失plt.plot(epochs,train_losses,label='TrainingLoss')plt.title('TrainingLossOverEpochs')plt.xlabel('Epochs')plt.ylabel('Loss')plt.legend......
  • 《流畅的Python》 读书笔记 第7章_函数装饰器和闭包
    第7章函数装饰器和闭包装饰器这个名称可能更适合在编译器领域使用,因为它会遍历并注解句法树函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。这是一项强大的功能,但是若想掌握,必须理解闭包如果你想自己实现函数装饰器,那就必须了解闭包的方方面面,因此也就需......
  • for循环,range函数,无线while循环
    #for循环中,含有for遍历;其语法结构是:for+变量(设置一个变量)+in+遍历对象#range函数,是Python中的一个内置函数,产生一个{n,m)的整数序列,其中包含n,不包含m#在使用for遍历时将变量用range函数来代替,那么这时for循环将遍历range中的序列中的元素。foriinrange(1,11):......
  • 表连接和截取字段函数
    selecte.ename,d.dnamefromempeleftjoindeptdone.DEPTNO=d.DEPTNOwheresubstr(e.ename,2,1)='M'; 函数之前需要干干净净,图中 表.函数不符合语法报错了  ......
  • 通过一道题目带你深入了解WAF特性、PHP超级打印函数、ASCII码chr()对应表等原理[RoarC
    题目环境:<br/>依此输入以下内容并查看回显结果1+11'index.phpls<br/><br/>到这里没思路了F12查看源代码<br/>一定要仔细看啊,差点没找到,笑哭访问calc.php文件<br/>果然有点东西PHP代码审计error_reporting(0);关闭错误报告通过GET方式传参的参数numsho......
  • 前端学习-JavaScrip学习-sort()函数
    sort()函数默认按照字符串Unicode码排序如果希望按照数字大小排序,需要传参letarr=[2,4,5,6,22,9,10,111,2,1,32];console.log(arr.sort(function(a,b){returna-b;//升序//returnb-a;//降序}));参考链接:js排序——sort()排序用法......
  • 无涯教程-批处理 - Writing to Files函数
    通过重定向过滤器>也可以将内容写入文件,该过滤器可用于将任何输出重定向到文件,以下是一个简单的示例,说明如何使用redirection命令创建文件以将数据写入文件。@echooffdirC:\>C:\new.txt上面的代码片段首先使用DIR命令来获取整个C:\的目录列表。然后,它将获取该输出,并在重定向......
  • MySQL的存储函数、MySQL的触发器、MySQL的索引
    MySQL的存储函数概述MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数。存储函数和存储过程一样,都是在数据库中定义一些SQL语句的集合。存储函数与存储过程的区别:存储函数有且只有一个返回值,而存储过程可以有多个返回值,也可以没......