【无标题】

数理统计:
    1.描述统计
    2.推断统计 

1.描述统计
    1.什么是描述统计?
        描述统计 从数据中提取 变量的主要信息

    2.从数据中提取 变量的主要信息 =》 【指标】 统计量
    统计量:
        1.频率与频数 
        2.集中趋势分析:
            均值、中位数、众数、分位数
        3.离散程度分析:
            极差、方差、标准差
        4.分布形状:
            偏度、峰度
    3.提取 变量:
        1.数值变量 【就是一个table 中的 column  是数值类型】
        2.类别变量 【就是一个table 中的 column  是非数值类型 string 】 

1.频率与频数
    1.适用场景 =》类别变量
    2.频数:就是 每个不同的取值出现的次数
    3.频率:每个不同的取值出现的次数 与总次数的比值 用%表示

    意义:
        类别变量中,每个取值出现的次数
    
    eg:
        A班级 及格 30人 , B班级及格 35人 能说明()
            1.A班级 成绩更好
            2.B班级 成绩更好
            3.成绩差不多
            4.无法确定哪个班级成绩好
        
        分析:
            1.类别变量  =>  及格
            2. 频数 =》及格人数 


1.集中趋势分析:
            均值、中位数、众数、分位数

均值: 一组数据的总和 除以 数据的个数 
    
    均值 = 和 / 个数 

中位数:一组数据的 按照 升序进行排列 最中间的位置 就是 中位数 

众数: 一组数据 出现的次数最多的值


注意:
    1.数值变量: 
        均值、中位数   表示一组数据 的 集中程度
    2.类别变量:
        众数 集中程度
    
    3.分布:  
        正太分布:
        偏态分布:    
            左偏分布: 均值在 最左边 
            右偏分布:均值在 最右边 
    4.影响:
        1.均值 =》 受 极端值 影响 、
        2.中位数 众数  不受极端值影响 【稳定】
        3.众数 一组数据 中 可能不是唯一的 【单拿出来 是不行的】


        问: 
            国家城市统计居民收入水平 , 使用那个指标衡量 更合适 ?
                1.均值
                2.中位数
                3.中位数或者众数 
                4.都可以 
        
        意义: 
            衡量数据综合水平 

            思考: 
                缺失值 填充 如何处理?
                    1.数据  =》 0  
                    2. 数据 去掉 
                    3. 补充 =》 中位数

分位数:
    通过 (n-1 ) 分位  划分 n个区间
    每个区间数据的个数是相等的 (近似相等)

    意义: 
        利用分位数 +  极值  可以判断 数据的分布状态

集中趋势分析:
    弊端 :
         5 5 5 5        =》  5
         0 -5 20 5         =》 5
         -100 100 120 -100 =》5

离散程度分析:
    极差 、方差 、标准差 
极差:一组数据中 ,最大值 - 最小值 
方差: 一组数据中  每个元素 与 均值的偏离 大小
标准差:就是方差的开方

意义: 
    方差/标准差:
        1.数据的分散性 
            越大  数据越分散
            越小  数据越集中
        2.数据的波动性
            越大  波动越大
            越小   波动越小

分布形状:
    偏度、峰度 

1.偏度:
    倾斜程度的度量 
    eg:    
        数据 -》 正态分布 偏度就是 0 
        数据 -》 左偏分布 偏度就是 小于0  
        数据 -》 右偏分布 偏度就是  大于0  

2.峰度:
    描述 数据分布 陡缓的程度 
    1.标准 正态分布 峰度 0 
    2.如果 峰度 > 0 :
        数据在分布上 数据比 标准 正态分布 密集  =》 方差比较 小 
    2.如果 峰度 < 0 :
    数据在分布上 数据比 标准 正态分布 分散  =》 方差比较 大

    意义: 
        1.  =》 数据的分布特征 
        2. 数据正太校验

基本命令: 

1.mv + cp  
    1.mv 剪切
    2.cp  复制 

    mv  =》 文件个数 始终是1分 
    cp  =》 文件个数 始终是2分

    1.移动
        [root@sygy10 bigdata]# mv 1.log ../1.log
        [root@sygy10 bigdata]# cp ~/1.log ./

    2.改名字 
        [root@sygy10 ~]# mv 1.log 1.log_blk
        [root@sygy10 ~]# cp 1.log_blk 1.log

    标准写法:
        mv xx.log  bigdata/xx.log
        cp xx.log  bigdata/xx.log
    不标准写法: 
        mv xx.log  bigdata/
        cp xx.log  bigdata/

2.上传下载 

    1.xshell 工具 

    2.命令 
        linux 安装一个 包 :  pip
            yum install  -y  lrzsz 
        
        rz 上传
        sz 下载

    3.xshell 工具

3.rm 删除文件 或者 文件夹 (高危命令)

    1.文件
        [root@sygy10 ~]# rm 1.log_blk
        rm:是否删除普通文件 "1.log_blk"?y

        [root@sygy10 ~]# rm -f jdk-8u212-linux-x64.tar.gz

    2.文件夹 
        [root@sygy10 ~]# rm -r bigdata/
            rm:是否进入目录"bigdata/"? y
            rm:是否删除普通文件 "bigdata/1.log"?y
            rm:是否删除目录 "bigdata/"?y
        [root@sygy10 ~]# rm -r -f dir1/ 
        rm -rf xxx [通用的写法]

4. alias (别名) 

    别名使用:
        alias ll='ls -l --color=auto'

        alias aa="cd /tmp"

        1.使用
        [root@sygy10 ~]# alias aa="cd /tmp"
            [仅仅当前会话生效]

        2.aa 命令 在任何地方都能使用?    
            1.环境变量 
                [root@sygy10 tmp]# echo $PATH
                /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
            2.环境变量 配置文件 : 
                1.全局的  [所用用户都可以使用]
                    /etc/profile

                2.个人的  【只能是当前用用户能使用,其他不能使用】 
                    ~/.bashrc 
                    ~/.bash_profile 
            
            3.生效 
                source /etc/profile
                source ~/.bashrc 
                source ~/.bash_profile 

            
            eg :  =》  1.命令 在任何地方都能使用
                [root@sygy10 ~]# vim /etc/profile
                配置了一个 aa 别名
            

            eg:  =》 2。所用用户都可以使用 aa 
                useradd zs  【创建用户】
                su - zs   【切换用户】
                [root@sygy10 tmp]# useradd zs
                [root@sygy10 tmp]# su - zs
                [zs@sygy10 ~]$ 
                [zs@sygy10 ~]$ pwd
                /home/zs
                [zs@sygy10 ~]$ aa
                [zs@sygy10 tmp]$ pwd
                /tmp
                [zs@sygy10 tmp]$

        2.个人的  【只能是当前用用户能使用,其他不能使用】 
                    ~/.bashrc 
                    ~/.bash_profile 


5.历史命令 
    history 
        mysql =》 
            mysql  -uroot -p
    [root@sygy10 ~]# aa_zs
    [root@sygy10 tmp]# !281            

6.tab  自动补全的功能 
    按tab 键 按一次 自动补全 或者 过滤 
    按tab 键 按二次 过滤

7. 用户相关的命令

    1.用户、用户组 
        1.用户 
            [root@sygy10 ~]# ll /usr/sbin/user*
            -rwxr-x---. 1 root root 118192 11月  6 2016 /usr/sbin/useradd
            -rwxr-x---. 1 root root  80360 11月  6 2016 /usr/sbin/userdel
            -rwxr-x---. 1 root root 113840 11月  6 2016 /usr/sbin/usermod
        2.用户组
            [root@sygy10 ~]# ll /usr/sbin/group*
            -rwxr-x---. 1 root root 65480 11月  6 2016 /usr/sbin/groupadd
            -rwxr-x---. 1 root root 57016 11月  6 2016 /usr/sbin/groupdel
            -rwxr-x---. 1 root root 57064 11月  6 2016 /usr/sbin/groupmems
            -rwxr-x---. 1 root root 76424 11月  6 2016 /usr/sbin/groupmod

    
    3.创建用户 
        [root@sygy10 ~]# useradd xinwei
        [root@sygy10 ~]# id xinwei
        uid=1002(xinwei) gid=1002(xinwei) 组=1002(xinwei)

    4.创建一个用户:
        1.用户名称 xinwei
        2.创建了一个用户组 xinwei  
        3.创建了一个 家目录 :/home/xinwei

        用户 : 用户组 :
                    主组 
                    附属组

        1.用户信息     =》文件 记录   [root@sygy10 ~]# vim /etc/passwd
        2.用户组信息 =》 文件 记录  [root@sygy10 ~]# vim /etc/group

    5.切换用户 su  
        [root@sygy10 ~]# su - xinwei
        [root@sygy10 ~]# su xinwei

    
    6.样式丢失 

        如何解决: 
            1.-bash-4.2$ cd /etc/skel/
            2.-bash-4.2$ cp ./.* ~
    
    7.用户组 
        [root@sygy10 ~]# groupadd bigdata
        [root@sygy10 ~]# usermod -a -G bigdata zs

        需求: 
            zs  要求 主组是 bigdata ,附属组 zs 也要
                1.[root@sygy10 ~]# usermod -g bigdata zs
                2.[root@sygy10 ~]# usermod -a -G zs zs

    8.修改用户的密码 ;
        passwd :
            1.root /当前用户 : :
                [root@sygy10 ~]# passwd zs
             

    9.sudo  普通用户 临时 使用root的最大权限 

        1.配置  /etc/sudoers
            zs      ALL=(ALL)       NOPASSWD: ALL
        2. 使用 
            sudo xx


        思考:
            sudo su - xxx :
                1.命令报不报错 
                2.需不需要输入密码    

        cdh : hdfs yarn hive hbase 
            su - yarn  [切换不了]
            su - hive 【有点问题】
        /sbin/nologin =》 还有个提示

8.文件权限的命令

    1.权限
    -rw-r--r--. 1 root root    7 4月  13 13:53 1.log
    drwxr-xr-x. 2 root root 4096 4月  12 14:03 dir2


    drwxr-xr-x: 10字母  =》 权限 

        第一字母: 
            d: 文件夹 
            -:文件 
            l:软连接 (win 快捷方式)

        权限:rwxr-xr-x  9个决定的  755
        第一组:rwx  =》 4+2+1 = 7  所属用户的权限
        第二组 r-x  =》 4+0+1 = 5    所属用户组的权限
        第三组 r-x =》 4+0+1 = 5    其他用户组的权限

        权限: 
            r 读权限     4
            w 写权限     2
            x 执行权限    1    
            - 没权限    0    
        - rw- r-- r-- =》


    2.修改权限命令  -R
        chmod 
            chmod 646 ./1.log
    3.chown 改变 所属者 
        [root@sygy10 tmp]# chown zs:zs 1.log


9.其他命令: 
    1.查找文件: 
        1.find  
            [root@sygy10 ~]# find / -name "*1.log*"
        2.locate 
            locate 

    2.系统相关的命令: 
        1.内存
            free
        2.磁盘
            df 
        3.负载 
            top
            load average: 0.00, 0.01, 0.05    各自不要超过 10 
    
    3.可能遇到的问题 : 
        编辑文件 swp文件

进程+端口号 :    

    yum : httpd 

    1.查看进程号:     
        1.java 代码 =》 jdk =》 jps 
        2. ps -ef | grep 程序的名字(pid)  => pid 

    2.查看端口号  port 
        netstat -nlp | grep pid 
    
通讯的命令:
    1.ping ip 
    2.telnet ip port     

下载 : 
    1. wget 
    2.curl 

    命令 + url 

tar : 
    linux 处理 归档文件的命令 

归档文件:    

普通文件:1.log  1m
归档文件:1.log.tar 1m
压缩文件:1.log.tar.gz 0.9m

1.普通 =》压缩 归档文件  
    1.log =》1.log.tar.gz

tar  -zcvf  xxx.tar.gz file...

    -cf  => 创建一个新归档 +   使用归档文件
    z  => 压缩 gz
    v  =》详细地列出处理的文件

eg: 
    [root@sygy10 ~]# tar -zcvf dir.tar.gz dir2 dir4 jdk-8u212-linux-x64.tar.gz

2.解压 
tar -zxvf  xxx.tar.gz
    -xf => 解压 +使用归档文件
    z  => 压缩 gz
    v  =》详细地列出处理的文件

百度 、谷歌 、 加一个功能 =》 github 码云  flinkcdc =》 maxwell 源码 =》 flink antrl4 sql 

shell :

    1.什么是shell ? 脚本语言  python
        1.一个编程的语言
        2.可以执行的文件
        3.文件内容 linux命令组成的

1.shell语法入门 

1.入门 
    1.文件 xxx.sh 结尾 
    2.第一行 #!/bin/bash

    1.编写脚本 
    vim wc.sh

    2.得有执行权限【不一定】
        1.不给文件权限 
        sh xxx.sh 

        [root@sygy10 shell]# sh ./wc.sh 
        word count
        [root@sygy10 shell]# cat wc.sh 
        #!/bin/bash
        echo "word count"

        2.给文件 执行权限
        [root@sygy10 shell]# chmod 744 ./wc.sh
        [root@sygy10 shell]# ./wc.sh 
        word count

        [root@sygy10 shell]# sh ./wc.sh 
        word count

        补充:
            1.给权限
            [root@sygy10 shell]# chmod u+x ./wc.sh
            [root@sygy10 shell]# ./wc.sh 
            word count
            [root@sygy10 shell]# ~/shell/wc.sh 
            word count
            [root@sygy10 shell]# sh ~/shell/wc.sh 
            word count

            2. debug 
            1.[root@sygy10 shell]# sh -x ./wc.sh

            2.
                #!/bin/bash -x
                echo "word count"

2.定义变量 引用

    eg:
    [root@sygy10 shell]# cat variable.sh 
    name="zhangsan"
    dt1="date"
    dt2=`date`
    echo $name
    echo $dt1
    echo $dt2

    1.定义变量的方式:
        key=value
        注意: 
            1.= 前后不能有空格
            2.变量名一般都是大写的【标准】
    2.变量的种类:
        shell中变量的数据类型 =》 string 
        1.静态
            k="v" k='v' k=v
        2.动态 
            k=`v` : v是变量 v系统自带的命令
    3.引用 
        $k 
        ${k} 

任务调度:
    shell =》 
        时间点: T+1 、h+1 20min 
            20220414  =》20220413  
                20220414 0:05
                    1.yarn资源
                    2.看你几点上班 
    crontab 命令 =》 定时调度
    开源框架:
        dophschudule 【恢复数据、重跑数据】
        xxl  【shell -》 】
        azkanban xx 
        ozzio  xx
        airflow 【费劲】
        runduck 
        自己开发

3.shell脚本 参数传递 :
    1.$n 
        $1 $2

    [root@sygy10 shell]# cat parameter.sh 
    echo "脚本文件名: $0"
    echo "第一个参数:$1"
    echo "第二个参数:$2"
    echo "参数个数: $#"
    echo "传递的参数作为一个字符串: $*"
    echo "传递的参数作为一个字符串: $@"
    echo "脚本运行时的pid :$$"

    补充:
        1.传递参数 “空格” 作为符号分割
        2.参数本身带有空格 要加双引号

4.数组 
    语法格式: 
        arr=(v1 v2 ... vn)
        1.数组用()表示
        2.元素用 空格 分割 
    eg: 
        [root@sygy10 shell]# cat arr.sh 
        arr=(zs lisi ww zl)
        echo "所有元素 : ${arr[@]}"
        echo "第一个元素 : ${arr[0]}"
        echo "元素个数 : ${#arr[@]}"


5.流程控制
    分支
    循环 
    1.分支 if  else 

    语法格式:
        if condition;then
            业务代码
        else
            业务代码
        fi

condition => 条件判断语法 
    [ condition ]
    结果:
        非空 true 
        空 false 
        [ hadoop ]

        $? => 获取上一个程序运行的结果 :
                1.成功 0
                2.失败 非0的数据
        条件表达式:
            1.数值判断
                =  等于
                == 等于
                -lt 小于
                -eq 等于 
                -ge 大于等于
                -le 小于等于
                -gt 大于
                -ne 不等于

            2.权限判断 
                -r 
                -w 
                -x 
            3.文件判断 
                -f 
                -e 
                -d 

            eg:
                [root@sygy10 shell]# cat if.sh 
                name1="zs"
                name2="lisi"

                if [ ${name1} == ${name2} ];then
                    echo "等于"
                else 
                    echo "不等于"
                fi
        if elif 语法格式:
            if condition;then
                业务代码
            elif condition;then
                业务代码    
            else
                业务代码
            fi
        
        eg:
            [root@sygy10 shell]# cat if_2.sh 
            score=$1

            if [ ${score} -gt 90 ];then
                echo "优秀"
            elif [ ${score} -ge 60 ];then
                echo "良"
            else 
                echo "不及格"
            fi

循环:
    语法格式:
        foreach:
            for el in item1 item2 ... itemn
            do 
                业务代码
            done 

        for i :
            语法格式 :
                for((i=0;i<size;i++))
                do 
                    业务代码
                done
        eg:
            [root@sygy10 shell]# cat for.sh 
            for x in 1 2 3 4
            do

                echo "${x}"
            done

            echo "-----------------"

            for((i=0;i<5;i++))
            do 
                echo "v is ${i}"
            done

        while:
            while condition
            do 
                业务代码
            done

        eg:
            [root@sygy10 shell]# cat while.sh 
            i=1
            while ((${i}<=5))
            do
                echo "v is ${i}"
                let i++
            done

        总结:
            条件表达式 不能用 <  > 

            while for  能用 < >  不能用 -gt 

            []  =》 条件判断
            ()  =>  数值运算 
            https://blog.csdn.net/taiyang1987912/article/details/39551385?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=1

监控 服务器 
    ip hostname 
    linux01 linux02 linux03 

     df  
     free  

    [root@sygy10 shell]# cat split.sh 
    str="linu01,linu02,linux03"
    arr=(${str//,/ })

    for linux  in $arr[@]
    do
        echo ${linux}
    done

    str.split(",")
    shell => 
        IFS变量 =》 字符串分割的效果

补充: linux 文本分析的 命令
    awk  =》 取出文本内容
    sed  =》 文本替换

awk : 
    1.获取列 
    [root@sygy10 shell]# cat 1.log | awk '{print $1}'
    a
    1
    [root@sygy10 shell]# cat 1.log | awk '{print $1,$2}'
    a b
    1 2

    2.获取行 
    [root@sygy10 shell]# cat 1.log | awk 'NR==1{print}'
    a b c
    [root@sygy10 shell]# cat 1.log | awk 'NR==2{print}'
    1 2 3
    [root@sygy10 shell]# cat 1.log | awk 'NR>1{print}'
    1 2 3
    [root@sygy10 shell]# cat 1.log | awk 'NR>=1{print}'

2.sed 
    文本替换 
    1.a 替换成 dd 

    [root@sygy10 shell]# cat 2.log 
    a a b
    1 a 3
    [root@sygy10 shell]# sed -i 's/a/dd/' 2.log  #每行 第一次遇到 a 替换成dd 
    [root@sygy10 shell]# cat 2.log 
    dd a b
    1 dd 3

    2.全局替换 
    把所有的a 都替换成 dd  
    [root@sygy10 shell]# sed -i 's/a/dd/g' 2.log

    坑: 
        [root@sygy10 shell]# sed -i 's#dd#a#g' 2.log

        替换文件路径:
            /path/a 

            p1="/path/a"
            p1="/path1/a1"

            sed -i 's/\/path\/a/\/path1\/a1/g' 3.log

            sed -i 's#/path/a#/path1/a1#g' 3.log

    sql => 文件 

        spark-submit   -f xxx.sql  

        hive -f "sele"
            -e 


linux模板机:
    1. ip 动态ip =》静态ip 
            1.内网
            2.学习方便 
    2.关闭防火墙 :
         1-65535
         关闭防火墙
    3.额外的安装包 :
        1.jdk =》 卸载掉 
        2.mysql =》 mysql自带的额外包【安装mysql 去掉就行】 【superset mysql自带的额外包】 


ip:
    1.win =》 vmware :
        1.子网ip  1-255
            192.168.10.0 
        2.网关 
            192.168.10.2
        
    2.linux => 静态ip 
        IPADDR=192.168.10.10
        GATEWAY=192.168.10.2
        DNS1=192.168.10.2

        [root@sygy10 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
        BOOTPROTO="static"
        ONBOOT="yes"
        IPADDR=192.168.10.10
        GATEWAY=192.168.10.2
        DNS1=192.168.10.2
        
        【重启网络或者 重启机器】
            service network restart 

关闭防火墙:
    systemctl stop firewalld
    systemctl disable firewalld

额外的安装包 :
        1.jdk =》 卸载掉 
        rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps

linux =》 centos :
    1.安装软件:    
        1.yum 
        2.rpm 
        3.tar 

rpm :
    卸载:
        1.查询 java 
        rpm -qa | grep -i java

        2.卸载
        rpm -e --nodeps xxx 

克隆之后:
    1.机器的名字
        vim /etc/hostname
    2.机器的ip 
        10 -》 03
        vim /etc/sysconfig/network-scripts/ifcfg-ens33
            改ip 跟机器号对应上 


规范:
[hadoop@sygy03 ~]$ mkdir app project software shell data log

MySQL:
    1.版本:
        5.6 【少】
        5.7  【多】
        8.x    【】 
    
    2.部署平台:
        win =》 
        mac =》 
        linux =》 
            1.两种方式 
                1.rpm包 =》 部署简单  【学习使用】
                2.tar包 =》 部署复杂 【生产上用】

安装mysql: 
    1.卸载 mysql 相关的包 
    [root@sygy03 software]# rpm -qa|grep mariadb
    mariadb-libs-5.5.56-2.el7.x86_64
    [root@sygy03 software]# rpm -e --nodeps  mariadb-libs
    [root@sygy03 software]# rpm -qa|grep mariadb

    2.安装mysql 
        1.解压
    [root@sygy03 software]# tar -xvf ./mysql-8.0.21-1.el7.x86_64.rpm-bundle.tar -C ./mysql
        2.安装
        rpm :
        rpm -ivh mysql-community-common-8.0.21-1.el7.x86_64.rpm 
        rpm -ivh mysql-community-libs-8.0.21-1.el7.x86_64.rpm
        rpm -ivh mysql-community-libs-compat-8.0.21-1.el7.x86_64.rpm
        rpm -ivh mysql-community-client-8.0.21-1.el7.x86_64.rpm
        rpm -ivh mysql-community-server-8.0.21-1.el7.x86_64.rpm

        3.启动
            1.查看配置mysql
            vim /etc/my.cnf 

                日志文件:/var/log/mysqld.log
            2.mysql 初始化 
            mysqld --initialize --user=mysql

            临时密码:
                root@localhost: (mdeIsSmq3s6

                root
                (mdeIsSmq3s6

            3.启动mysql 
            systemctl start mysqld

            4.登录mysql 
            [root@sygy03 mysql]# mysql -uroot -p\(mdeIsSmq3s6

            5.修改密码 
            alter user root@localhost identified by '123456';

            6.修改任何 ip 都可以访问 mysql 
            update mysql.user set host='%' where user='root';

            7.刷新权限
            flush privileges;


mysql 远程连接工具:
    1.dbvear =》 hive phoniex clickhouse 
    2.netcat 
    3. db 


mysql 语法:

1.聚合函数(分组函数)

group By =》 分组 
聚合函数  =》 指标统计 sum avg max min  count 

需求: 
    统计 每个部门有多少个人 ?
c查什么:
    维度 : 部门
    指标 : 人数

聚合统计逻辑: 

    聚合统计:
        group by  +聚合函数 
    group by =》 分组 
    20,<20,20,20>
    30,<30,30,30,30>
    10,<10,10,10,10>

    聚合函数  =》 指标 count  
    20,3
    30,4


2.开窗函数 
    1.聚合函数 : 多行数据 按照一定规则 进行聚合 为一行
        sum avg max 。。。 
        理论上: 聚合后的行数 <= 聚合前的行数 [看维度选取 groupby 里面的字段]

    2.需求: 
        既要显示 聚合前的数据 又要显示 聚合后的数据 ?

    eg:    
    id name  sal      dt          sal_all    
    1  zs    1000     2022-4        1000
    2  ls    2000     2022-4        2000
    3  ww    3000     2022-4        3000
    1  zs    1000     2022-5        2000
    2  ls    2000     2022-5        4000
    3  ww    3000     2022-5        6000

窗口函数: 
    窗口 + 函数 
    窗口: 函数运行时 计算的数据集的范围
    函数:运行时的函数
        1.聚合函数
        2.内置窗口函数

    语法结构:
        函数 over([partition by xxx,...]  [order by xxx,...] )

        over() :以谁进行开窗 【table】
        partition by: 以谁进行分组 【group by  column】
        order by: 以谁进行排序 【column】


窗口函数:

数据:
    服务器 每天的启动 次数 

    linux01,2022-04-15,1
    linux01,2022-04-16,5
    linux01,2022-04-17,7
    linux01,2022-04-18,2
    linux01,2022-04-19,3
    linux01,2022-04-20,10
    linux01,2022-04-21,4

统计累计问题:
    需求: 
        每个服务器每天的累计 启动次数 
name      dt       cnt  
linux01,2022-04-15,1
linux01,2022-04-16,5
linux01,2022-04-17,7
linux01,2022-04-18,2
linux01,2022-04-19,3
linux01,2022-04-20,10
linux01,2022-04-21,4

name      dt       cnt      cnt_all
linux01,2022-04-15,1        1
linux01,2022-04-16,5        6
linux01,2022-04-17,7        13
linux01,2022-04-18,2        15
linux01,2022-04-19,3        18
linux01,2022-04-20,10        28
linux01,2022-04-21,4        32

create table window01(
    name varchar(50),
    dt varchar(20),
    cnt int
);

每个服务器每天的累计 启动次数  

1.聚合函数  
    COUNT,SUM,MIN,MAX,AVG
select 
name,
dt,
cnt,
sum(cnt) over(partition by name  order by dt ) as cnt_all
from window01;

2.内置窗口函数 


窗口大小:
    select 
name,
dt,
cnt,
sum(cnt) over(partition by name  order by dt ) as sum_all,
-- sum(cnt) over(partition by name  order by dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  ) as sum_all1
-- sum(cnt) over(partition by name  order by dt ROWS BETWEEN 3 PRECEDING AND CURRENT ROW ) as sum_all2
-- sum(cnt) over(partition by name  order by dt ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING ) as sum_all3
-- sum(cnt) over(partition by name  order by dt ROWS BETWEEN 3 PRECEDING AND UNBOUNDED FOLLOWING) as sum_all4
sum(cnt) over(partition by name  order by dt ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) as sum_all5

from window01;


2.内置窗口函数
    1.取值 串行 

    2.排序 
    RANK
    ROW_NUMBER
    DENSE_RANK
    CUME_DIST
    PERCENT_RANK
    NTILE

NTILE:

ntile  
    需求:
        把数据按照某个字段进行排序 ,把数据分成几分  

select 
name,
dt,
cnt,
sum(cnt) over(partition by name  order by dt ) as sum_all,
ntile(2) over(partition by name  order by dt ) as n2,
ntile(3) over(partition by name  order by dt ) as n3
from window01 ;
    把数据平均分配 指定 N个桶 ,如果不能平均分配 ,优先分配到 编号 小的里面


RANK
ROW_NUMBER
DENSE_RANK


RANK:  从1 开始 , 按照顺序 相同会重复 名次会留下 空的位置 生成组内的记录编号
ROW_NUMBER: 从1 开始 , 按照顺序 生成组内的记录编号
DENSE_RANK:从1 开始 , 按照顺序 生成组内的记录编号 相同会重复 名次不会会留下空的位置

select 
name,
dt,
cnt,
sum(cnt) over(partition by name  order by dt ) as sum_all,
RANK() over(partition by name  order by cnt desc ) as rk,
ROW_NUMBER() over(partition by name  order by cnt desc) as rw,
DENSE_RANK() over(partition by name  order by cnt desc ) as d_rk
from window01 ;

    1. 串行
        LEAD
        LAG

        1. 串行
        LEAD:窗口内 向下 第n行的值
        LAG:窗口内 向上 第n行的值
            LEAD(column,n,default)
            column => 列名 
            n =》 取 几行 
            default =》 取不到就给一个默认值

            select 
            name,
            dt,
            cnt,
            sum(cnt) over(partition by name  order by dt ) as sum_all,
            LEAD(dt,1,"9999-99-99")  over(partition by name  order by dt ) as lead_alias,
            LAG(dt,1,"9999-99-99")  over(partition by name  order by dt ) as lag_alias
            from window01 ;

    2.取值
    FIRST_VALUE
    LAST_VALUE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值