一、默认窗口与排名函数

最常用的分析函数是排名函数,用于返回当前记录在窗口中的位置。常用的排名函数包括rank()、dense_rank()、row_number()等。排名函数所对应的窗口函数必须指定排序规则,即必须使用order by 子句,而Oracle为每条记录提供的默认窗口为从表中第一条记录开始,直至与当前记录具有相同排名的所有记录。

先看下Oracle的示例表scott.emp

select * from emp;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30

7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30

7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20

7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30

7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850                    30

7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10

7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30

7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20

7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30

7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20

7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10

1、rank()函数

将表中员工按入职时间升序排列,列出排名次序

select empno, ename, hiredate, rank() over(order by hiredate) hiredate_order from emp;

EMPNO ENAME      HIREDATE            HIREDATE_ORDER

---------- ---------- ------------------- --------------

7369 SMITH      1980-12-17 00:00:00              1

7499 ALLEN      1981-02-20 00:00:00              2

7521 WARD       1981-02-22 00:00:00              3

7566 JONES      1981-04-02 00:00:00              4

7698 BLAKE      1981-05-01 00:00:00              5

7782 CLARK      1981-06-09 00:00:00              6

7844 TURNER     1981-09-08 00:00:00              7

7654 MARTIN     1981-09-28 00:00:00              8

7839 KING       1981-11-17 00:00:00              9

7900 JAMES      1981-12-03 00:00:00             10

7902 FORD       1981-12-03 00:00:00             10

7934 MILLER     1982-01-23 00:00:00             12

7788 SCOTT      1987-04-19 00:00:00             13

7876 ADAMS      1987-05-23 00:00:00             14

该函数的排名具有跳跃性,如7900和7902员工排名都是10,而下一位7934员工排名则为12。

2、dense_rank()函数

类似rank()函数,但排名不具有跳跃性

select empno, ename, hiredate, dense_rank() over(order by hiredate) hiredate_order from emp;

EMPNO ENAME      HIREDATE            HIREDATE_ORDER

---------- ---------- ------------------- --------------

7369 SMITH      1980-12-17 00:00:00              1

7499 ALLEN      1981-02-20 00:00:00              2

7521 WARD       1981-02-22 00:00:00              3

7566 JONES      1981-04-02 00:00:00              4

7698 BLAKE      1981-05-01 00:00:00              5

7782 CLARK      1981-06-09 00:00:00              6

7844 TURNER     1981-09-08 00:00:00              7

7654 MARTIN     1981-09-28 00:00:00              8

7839 KING       1981-11-17 00:00:00              9

7900 JAMES      1981-12-03 00:00:00             10

7902 FORD       1981-12-03 00:00:00             10

7934 MILLER     1982-01-23 00:00:00             11

7788 SCOTT      1987-04-19 00:00:00             12

7876 ADAMS      1987-05-23 00:00:00             13

7900和7902员工排名都是10,而下一位7934员工排名则为11,排名不存在跳跃。

3、row_number()函数

row_number()函数单纯返回当前记录在窗口中所处位置的行号,该行号具有唯一性。以上查询用row_number()函数替代后如下

select empno, ename, hiredate, row_number() over(order by hiredate) hiredate_order from emp;

EMPNO ENAME      HIREDATE            HIREDATE_ORDER

---------- ---------- ------------------- --------------

7369 SMITH      1980-12-17 00:00:00              1

7499 ALLEN      1981-02-20 00:00:00              2

7521 WARD       1981-02-22 00:00:00              3

7566 JONES      1981-04-02 00:00:00              4

7698 BLAKE      1981-05-01 00:00:00              5

7782 CLARK      1981-06-09 00:00:00              6

7844 TURNER     1981-09-08 00:00:00              7

7654 MARTIN     1981-09-28 00:00:00              8

7839 KING       1981-11-17 00:00:00              9

7900 JAMES      1981-12-03 00:00:00             10

7902 FORD       1981-12-03 00:00:00             11

7934 MILLER     1982-01-23 00:00:00             12

7788 SCOTT      1987-04-19 00:00:00             13

7876 ADAMS      1987-05-23 00:00:00             14

4、count()函数

通过count()函数可以查看窗口中实际的记录数目,以上查询用count()函数替代后如下

select empno, ename, hiredate, count(1) over(order by hiredate) hiredate_order from emp;

EMPNO ENAME      HIREDATE            HIREDATE_ORDER

---------- ---------- ------------------- --------------

7369 SMITH      1980-12-17 00:00:00              1

7499 ALLEN      1981-02-20 00:00:00              2

7521 WARD       1981-02-22 00:00:00              3

7566 JONES      1981-04-02 00:00:00              4

7698 BLAKE      1981-05-01 00:00:00              5

7782 CLARK      1981-06-09 00:00:00              6

7844 TURNER     1981-09-08 00:00:00              7

7654 MARTIN     1981-09-28 00:00:00              8

7839 KING       1981-11-17 00:00:00              9

7900 JAMES      1981-12-03 00:00:00             11

7902 FORD       1981-12-03 00:00:00             11

7934 MILLER     1982-01-23 00:00:00             12

7788 SCOTT      1987-04-19 00:00:00             13

7876 ADAMS      1987-05-23 00:00:00             14

二、分区窗口

分区窗口是与当前记录拥有相同的分区标准的所有记录,语法为

partition by 列名

partition by语句首先根据列名获得当前记录的列值,接着获得表中具有相同列值的所有记录,并将该记录集合作为当前记录的窗口。

需要注意的是,当在分区窗口中使用order by排序后,窗口返回的不再是全部记录,而是只到当前记录,从而成为默认大小的窗口。

示例:

查询EMP表每个员工的职位和薪水,并给出该职位员工的平均薪水

select empno, ename, job, sal, round(avg(sal) over(partition by job)) avg_sal from emp;

EMPNO ENAME      JOB              SAL    AVG_SAL

---------- ---------- --------- ---------- ----------

7788 SCOTT      ANALYST         3000       3000

7902 FORD       ANALYST         3000       3000

7934 MILLER     CLERK           1300       1038

7900 JAMES      CLERK            950       1038

7369 SMITH      CLERK            800       1038

7876 ADAMS      CLERK           1100       1038

7698 BLAKE      MANAGER         2850       2758

7566 JONES      MANAGER         2975       2758

7782 CLARK      MANAGER         2450       2758

7839 KING       PRESIDENT       5000       5000

7844 TURNER     SALESMAN        1500       1400

7654 MARTIN     SALESMAN        1250       1400

7521 WARD       SALESMAN        1250       1400

7499 ALLEN      SALESMAN        1600       1400

示例:

在查询每个员工职位和入职时间的同时,获得其在该职位中按入职时间进行的排序位置

select empno, ename, job, hiredate, dense_rank() over(partition by job order by hiredate) hiredata_order from emp;

EMPNO ENAME      JOB       HIREDATE            HIREDATA_ORDER

---------- ---------- --------- ------------------- --------------

7902 FORD       ANALYST   1981-12-03 00:00:00              1

7788 SCOTT      ANALYST   1987-04-19 00:00:00              2

7369 SMITH      CLERK     1980-12-17 00:00:00              1

7900 JAMES      CLERK     1981-12-03 00:00:00              2

7934 MILLER     CLERK     1982-01-23 00:00:00              3

7876 ADAMS      CLERK     1987-05-23 00:00:00              4

7566 JONES      MANAGER   1981-04-02 00:00:00              1

7698 BLAKE      MANAGER   1981-05-01 00:00:00              2

7782 CLARK      MANAGER   1981-06-09 00:00:00              3

7839 KING       PRESIDENT 1981-11-17 00:00:00              1

7499 ALLEN      SALESMAN  1981-02-20 00:00:00              1

7521 WARD       SALESMAN  1981-02-22 00:00:00              2

7844 TURNER     SALESMAN  1981-09-08 00:00:00              3

7654 MARTIN     SALESMAN  1981-09-28 00:00:00              4

三、窗口子句

窗口子句可以进一步限制或扩展窗口的范围。

1、rows子句

rows子句的使用前提为窗口已经利用order by 进行了排序。此时可以利用rows子句按照位置向前或向后追溯,从而进一步调整窗口大小。语法如下

over(order by 列名 rows between 位移量 preceding and 位移量 following)

preceding向前追溯处于当前记录之前的记录,following向后追溯处于当前记录之后的记录。

示例:

在查询每个员工入职时间和薪水的同时,计算与其前后相邻入职时间的共三位员工的平均薪水

select empno, ename, job, hiredate, sal, round(avg(sal) over(order by hiredate rows between 1 preceding and 1 following)) avg_sal from emp;

EMPNO ENAME      JOB       HIREDATE                   SAL    AVG_SAL

---------- ---------- --------- ------------------- ---------- ----------

7369 SMITH      CLERK     1980-12-17 00:00:00        800       1200

7499 ALLEN      SALESMAN  1981-02-20 00:00:00       1600       1217

7521 WARD       SALESMAN  1981-02-22 00:00:00       1250       1942

7566 JONES      MANAGER   1981-04-02 00:00:00       2975       2358

7698 BLAKE      MANAGER   1981-05-01 00:00:00       2850       2758

7782 CLARK      MANAGER   1981-06-09 00:00:00       2450       2267

7844 TURNER     SALESMAN  1981-09-08 00:00:00       1500       1733

7654 MARTIN     SALESMAN  1981-09-28 00:00:00       1250       2583

7839 KING       PRESIDENT 1981-11-17 00:00:00       5000       2400

7900 JAMES      CLERK     1981-12-03 00:00:00        950       2983

7902 FORD       ANALYST   1981-12-03 00:00:00       3000       1750

7934 MILLER     CLERK     1982-01-23 00:00:00       1300       2433

7788 SCOTT      ANALYST   1987-04-19 00:00:00       3000       1800

7876 ADAMS      CLERK     1987-05-23 00:00:00       1100       2050

对于第一条记录和最后一条记录来说,实际上对应的窗口只有两条记录。

2、range子句

rows子句以相对位置作为获取记录的标准,而range子句则以相对列值作为筛选记录的标准。语法如下

over(order by 列名 range between 差值 preceding and 差值 following)

示例:

在查询每个员工入职时间的同时,计算包括与其入职时间前后相差一年之内的员工数量

select empno, ename, job, hiredate, count(1) over(order by hiredate range between 365 preceding and 365 following) count_emp from emp;

EMPNO ENAME      JOB       HIREDATE             COUNT_EMP

---------- ---------- --------- ------------------- ----------

7369 SMITH      CLERK     1980-12-17 00:00:00         11

7499 ALLEN      SALESMAN  1981-02-20 00:00:00         12

7521 WARD       SALESMAN  1981-02-22 00:00:00         12

7566 JONES      MANAGER   1981-04-02 00:00:00         12

7698 BLAKE      MANAGER   1981-05-01 00:00:00         12

7782 CLARK      MANAGER   1981-06-09 00:00:00         12

7844 TURNER     SALESMAN  1981-09-08 00:00:00         12

7654 MARTIN     SALESMAN  1981-09-28 00:00:00         12

7839 KING       PRESIDENT 1981-11-17 00:00:00         12

7900 JAMES      CLERK     1981-12-03 00:00:00         12

7902 FORD       ANALYST   1981-12-03 00:00:00         12

7934 MILLER     CLERK     1982-01-23 00:00:00         11

7788 SCOTT      ANALYST   1987-04-19 00:00:00          2

7876 ADAMS      CLERK     1987-05-23 00:00:00          2

3、current row与unbounded

在窗口子句中,除了可以用确定的数值来限定窗口外,还可以使用current row来指定当前记录,使用unbounded来代替数值,表示不受限制的窗口范围。

向前位移无限制

select empno, ename, job, hiredate, sal, round(avg(sal) over(order by hiredate rows between unbounded preceding and current row)) avg_sal from emp;

向后位移无限制

select empno, ename, job, hiredate, sal, round(avg(sal) over(order by hiredate rows between 1 preceding and unbounded following)) avg_sal from emp;

前后位移均无限制

select empno, ename, job, hiredate, sal, round(avg(sal) over(order by hiredate rows between unbounded preceding and unbounded following)) avg_sal from emp;

四、常用分析函数

很多聚合函数均可以和窗口函数结合使用,如max()、min()、sum()等。除此之外,Oracle还提供了另外几种常用的分析函数。

1、first_value()函数

first_value()函数返回已排序窗口中第一条记录的相关信息。

示例:

在查询员工入职时间和所在部门的同时,指出该部门入职时间最早的员工

select empno, ename, hiredate, deptno, first_value(empno) over(partition by deptno order by hiredate) first_emp from emp;

EMPNO ENAME      HIREDATE                DEPTNO  FIRST_EMP

---------- ---------- ------------------- ---------- ----------

7782 CLARK      1981-06-09 00:00:00         10       7782

7839 KING       1981-11-17 00:00:00         10       7782

7934 MILLER     1982-01-23 00:00:00         10       7782

7369 SMITH      1980-12-17 00:00:00         20       7369

7566 JONES      1981-04-02 00:00:00         20       7369

7902 FORD       1981-12-03 00:00:00         20       7369

7788 SCOTT      1987-04-19 00:00:00         20       7369

7876 ADAMS      1987-05-23 00:00:00         20       7369

7499 ALLEN      1981-02-20 00:00:00         30       7499

7521 WARD       1981-02-22 00:00:00         30       7499

7698 BLAKE      1981-05-01 00:00:00         30       7499

7844 TURNER     1981-09-08 00:00:00         30       7499

7654 MARTIN     1981-09-28 00:00:00         30       7499

7900 JAMES      1981-12-03 00:00:00         30       7499

2、last_value()函数

与first_value()函数相反,last_value()函数返回分区中最后一条记录的相关信息。

示例:

在查询员工入职时间和所在部门的同时,指出该部门入职时间最迟的员工。首先说明,套用fist_value()的查询写法是不行的,如下

select empno, ename, hiredate, deptno, last_value(empno) over(partition by deptno order by hiredate) last_emp from emp;

EMPNO ENAME      HIREDATE                DEPTNO   LAST_EMP

---------- ---------- ------------------- ---------- ----------

7782 CLARK      1981-06-09 00:00:00         10       7782

7839 KING       1981-11-17 00:00:00         10       7839

7934 MILLER     1982-01-23 00:00:00         10       7934

7369 SMITH      1980-12-17 00:00:00         20       7369

7566 JONES      1981-04-02 00:00:00         20       7566

7902 FORD       1981-12-03 00:00:00         20       7902

7788 SCOTT      1987-04-19 00:00:00         20       7788

7876 ADAMS      1987-05-23 00:00:00         20       7876

7499 ALLEN      1981-02-20 00:00:00         30       7499

7521 WARD       1981-02-22 00:00:00         30       7521

7698 BLAKE      1981-05-01 00:00:00         30       7698

7844 TURNER     1981-09-08 00:00:00         30       7844

7654 MARTIN     1981-09-28 00:00:00         30       7654

7900 JAMES      1981-12-03 00:00:00         30       7900

没有达到希望的查询结果,原因正如前面所说,当在分区窗口中使用order by排序后,窗口返回的不再是全部记录,而是只到当前记录,从而成为默认大小的窗口。正确的做法是可以利用rows子句来指定无限制的窗口,如下

select empno, ename, hiredate, deptno, last_value(empno) over(partition by deptno order by hiredate rows between unbounded preceding and unbounded following) last_emp from emp;

EMPNO ENAME      HIREDATE                DEPTNO   LAST_EMP

---------- ---------- ------------------- ---------- ----------

7782 CLARK      1981-06-09 00:00:00         10       7934

7839 KING       1981-11-17 00:00:00         10       7934

7934 MILLER     1982-01-23 00:00:00         10       7934

7369 SMITH      1980-12-17 00:00:00         20       7876

7566 JONES      1981-04-02 00:00:00         20       7876

7902 FORD       1981-12-03 00:00:00         20       7876

7788 SCOTT      1987-04-19 00:00:00         20       7876

7876 ADAMS      1987-05-23 00:00:00         20       7876

7499 ALLEN      1981-02-20 00:00:00         30       7900

7521 WARD       1981-02-22 00:00:00         30       7900

7698 BLAKE      1981-05-01 00:00:00         30       7900

7844 TURNER     1981-09-08 00:00:00         30       7900

7654 MARTIN     1981-09-28 00:00:00         30       7900

7900 JAMES      1981-12-03 00:00:00         30       7900

由此可见,last_value()函数往往需要结合使用rows子句使用,因此,使用first_value()函数要优于使用last_value()函数。其实为了获得与last_value()相同的效果,使用first_value()函数时,只要为order by子句添加desc进行降序排列即可。

3、lag()函数

first_value()和last_value()可以返回窗口中第一条和最后一条记录,但不能处理其他记录。为此,Oracle提供了lag()函数和lead()函数来灵活处理其他记录。

lag()函数以当前记录为坐标,按照指定的位移量向上搜索,并尝试捕获记录,捕获不到时返回指定的默认值,语法如下

lag(列名或列表达式, 位移量, 默认值)

这里要求默认值的数据类型应当与列名或列表达式的类型兼容。

示例:

查询每个员工的工资信息,并给出工资排名在他前一位的员工

select empno, ename, sal, lag(empno, 1, null) over(order by sal) lag_empno, lag(ename, 1, 'N/A') over(order by sal) lag_ename from emp;

EMPNO ENAME             SAL  LAG_EMPNO LAG_ENAME

---------- ---------- ---------- ---------- ----------

7369 SMITH             800            N/A

7900 JAMES             950       7369 SMITH

7876 ADAMS            1100       7900 JAMES

7521 WARD             1250       7876 ADAMS

7654 MARTIN           1250       7521 WARD

7934 MILLER           1300       7654 MARTIN

7844 TURNER           1500       7934 MILLER

7499 ALLEN            1600       7844 TURNER

7782 CLARK            2450       7499 ALLEN

7698 BLAKE            2850       7782 CLARK

7566 JONES            2975       7698 BLAKE

7788 SCOTT            3000       7566 JONES

7902 FORD             3000       7788 SCOTT

7839 KING             5000       7902 FORD

4、lead()函数

该函数与lag()函数类似,不同之处是lead()函数的位移量为向下偏移。

示例:

查询每个员工的工资信息,并给出工资排名在他后一位的员工,这里直接用lead()替换lag()即可

select empno, ename, sal, lead(empno, 1, null) over(order by sal) lag_empno, lead(ename, 1, 'N/A') over(order by sal) lag_ename from emp;

EMPNO ENAME             SAL  LAG_EMPNO LAG_ENAME

---------- ---------- ---------- ---------- ----------

7369 SMITH             800       7900 JAMES

7900 JAMES             950       7876 ADAMS

7876 ADAMS            1100       7521 WARD

7521 WARD             1250       7654 MARTIN

7654 MARTIN           1250       7934 MILLER

7934 MILLER           1300       7844 TURNER

7844 TURNER           1500       7499 ALLEN

7499 ALLEN            1600       7782 CLARK

7782 CLARK            2450       7698 BLAKE

7698 BLAKE            2850       7566 JONES

7566 JONES            2975       7788 SCOTT

7788 SCOTT            3000       7902 FORD

7902 FORD             3000       7839 KING

7839 KING             5000            N/A

这里发现,当使用lead()函数做位移推进时,over(order by)这样原本只到当前记录的默认大小的窗口实际范围变大了,从而能够获取到往下的记录。

5、ratio_to_report()占比函数

查询每个员工的工资及其在所有员工和所在部门员工中的百分比

select empno, ename, sal, round((ratio_to_report(sal) over()) * 100, 2) pct1, round((ratio_to_report(sal) over(partition by deptno)) * 100, 2) pct2 from scott.emp;

EMPNO ENAME             SAL       PCT1       PCT2

---------- ---------- ---------- ---------- ----------

7782 CLARK            2450       8.44         28

7839 KING             5000      17.23      57.14

7934 MILLER           1300       4.48      14.86

7566 JONES            2975      10.25      27.36

7902 FORD             3000      10.34      27.59

7876 ADAMS            1100       3.79      10.11

7369 SMITH             800       2.76       7.36

7788 SCOTT            3000      10.34      27.59

7521 WARD             1250       4.31       13.3

7844 TURNER           1500       5.17      15.96

7499 ALLEN            1600       5.51      17.02

7900 JAMES             950       3.27      10.11

7698 BLAKE            2850       9.82      30.32

7654 MARTIN           1250       4.31       13.3

oracle分析函数以及窗口,Oracle分析函数与窗口函数相关推荐

  1. Oracle开发专题之:分析函数(OVER)

    目录: =============================================== 1.Oracle分析函数简介 2. Oracle分析函数简单实例 3.分析函数OVER解析 一. ...

  2. 虚拟机上装oracle,cmd窗口输入法有问题,按了U,I,O,P,J,K,L,M这些键为什么不是UIOPJK

    虚拟机上装oracle,cmd窗口输入法有问题  请电脑大神来看看我的输入法输入问题,按了U,I,O,P,J,K,L,M这些 键为什么不是UIOPJK 这个是某些笔记本的设定, 楼主只要在你的键盘上找 ...

  3. oracle数据库sql培训,Oracle数据库SQL语言实战培训教程(全面、详细、案例、精讲)套餐...

    风哥oracle数据库SQL语言实战培训教程(案例.精讲)套餐,DBA必备技能. 套餐介绍: 风哥Oracle数据库SQL语言实战培训教程(案例.精讲)套餐,DBA必备技能. 内容: SQL语言基础入 ...

  4. Oracle中的within,Oracle函数 --聚合函数中的语法within group

    Oracle的聚合函数一般与group by 联合使用,但一般通过group by 聚合 但某些聚合函数会后跟 WITHIN GROUP (ORDER BY expr [ DESC | ASC ] [ ...

  5. oracle中lead函数,oracle lead()函数 | 学步园

    ead()是一个分析函数,适用于oracle 8i以后的版本, 使用这个函数,你可以一次性从表中查询多条记录, 而不需要进行表的自连接. 返回值:返回与当前行偏离offset行的列值. 语法: lea ...

  6. 简单介绍oracle执行计划,Oracle性能优化之oracle中常见的执行计划及其简单解释

    一.访问表执行计划 1.table access full:全表扫描.它会访问表中的每一条记录(读取高水位线以内的每一个数据块). 2.table access by user rowid:输入源ro ...

  7. oracle 当前top sql,Oracle top 查询TOP SQL

    有时Oracle数据库服务器,系统CPU爆高,通过Top命令可以查看到占用CPU最高的进程 我们需要记住前几个TOP的pid号,带入下面的SQL,到数据库中查询运行的进程.服务器.用户.SQL.等待等 ...

  8. oracle cdc 提交顺序,Oracle CDC部署流程

    一.ORACLE环境检查 查oracle数据库版本(>9.2.0.4.0). select * from v$version; BANNER Oracle Database 10g Enterp ...

  9. oracle rman备份时间,Oracle使用RMAN进行备份详述

    备份理论和基本语法 备份概念 执行备份或还原的数据库称为目标.在一些环境下,有许多数据库,因此有许多RMAN目标.应一次连接每个数据库.目标的每个备份都有一些属性: 打开或关闭 完整或部分 完整或增量 ...

最新文章

  1. Python技术之Number数据类型介绍
  2. 机器学习-集成之随机森林算法原理及实战
  3. python之file 方法
  4. WPF 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
  5. 中国电影史上最大泄漏事故?国家版权局出手了...
  6. 50-00-010-配置-kylin-2.6.0官网配置
  7. 【正则表达式】正则表达式匹配${xxx}
  8. 计算机原理 ---- 程序之下
  9. awk之printf及相关参数详解
  10. leetcode 19
  11. CF468C Hack It! 构造
  12. 使用nssm管理Windows服务
  13. ffmpeg 再编译使用 ffmpeg-gl-transition
  14. css设置背景虚化,vue移动端登录页
  15. 上海电力大学计算机专业全国排名,上海电力大学有哪些专业 上海电力大学专业排名...
  16. cad快看_星期日来啦!分享5个珍藏已久的电影网站,各种大片免费看
  17. 对数据库某个字段进行去重
  18. 移动硬盘使用注意事项
  19. SwipeRefreshLayout+CoordinatorLayout+AppBarLayout+TabLayout+ViewPager+RecyclerView 嵌套,最后一项显示全
  20. [转载]推荐:互联网思维必读十本书

热门文章

  1. JSP开发环境搭建(Tomcat的安装和配置)
  2. 【雕爷学编程】Arduino动手做(54)---大按键点动模块
  3. 分数化成有限小数的方法_什么样的分数能化成有限小数?
  4. DB2 中很有帮助的一个函数 replace
  5. QQ强聊器原理和代码
  6. 惠普星系列F2F3之类键恢复及触摸板关闭方法
  7. Font Awesome 图标字体
  8. 动态规划-状态转移方程练习
  9. 水利施工行业工程项目管理
  10. Android Killer反编译卡死的一个解决方案