SQL server 中FIRST_VALUE函数和RANK函数

FIRST_VALUE()函数是一个窗口函数,它返回结果集的有序分区中的第一个值。

FIRST_VALUE函数基本语法:

FIRST_VALUE ( scalar_expression )  
OVER ( 
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
    [rows_range_clause]
)

scalar_expression是针对结果集的有序分区的第一行的值计算的表达式。 scalar_expression可以是计算为单个值的列,子查询或表达式。它不能是一个Window函数。
PARTITION BY子句将结果集的行分配到应用FIRST_VALUE()函数的分区中。 如果不使用PARTITION BY子句,FIRST_VALUE()函数会将整个结果集视为单个分区。简单说就是分组。
ORDER BY子句指定应用FIRST_VALUE()函数的每个分区中行的逻辑顺序。排序
rows_range_clause通过定义起点和终点进一步限制分区内的行。比如用RANK函数。


FIRST_VALUE函数实用:

select  *
from cw_billingdetail  where FeeItemId='f5da2b96-b3ac-42dc-ad4d-4d8a3a8ad4c5'

查询结果:
SQL server 中FIRST_VALUE函数和RANK函数_第1张图片
想找出不同的unitid第一笔费用,我们使用FIRST_VALUE函数来实现下。

select id,unitid,begindate,enddate, FIRST_VALUE(Id)over(partition by unitid order by begindate) as FIRST_VALUE
from cw_billingdetail  where FeeItemId='f5da2b96-b3ac-42dc-ad4d-4d8a3a8ad4c5' 

查询结果:
SQL server 中FIRST_VALUE函数和RANK函数_第2张图片
通过查询结果可以看到,unitid已经分好组并以begindate为标准排序好了。再用RANK函数对查询结果的每一行分配序号。


RANK()函数是一个Window函数,它为结果集的分区中的每一行分配一个排名。

RANK函数基本语法:

RANK()OVER ( 
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

PARTITION BY子句划分应用该函数的结果集分区的行。
ORDER BY子句指定应用该函数每个分区中行的逻辑排序顺序。


RANK函数实用

select id,unitid,begindate,enddate, FIRST_VALUE(Id)over(partition by unitid order by begindate) as FIRST_VALUE,RANK()over (partition by unitid order by begindate) as rank
from cw_billingdetail  where FeeItemId='f5da2b96-b3ac-42dc-ad4d-4d8a3a8ad4c5' 

查询结果:
SQL server 中FIRST_VALUE函数和RANK函数_第3张图片
然后我们只需要再加一个where条件就可以只查询出不同unitid的第一笔费用了

select * from 
(select id,unitid,begindate,enddate, FIRST_VALUE(Id)over(partition by unitid order by begindate) as FIRST_VALUE,RANK()over (partition by unitid order by begindate) as rank
from cw_billingdetail  where FeeItemId='f5da2b96-b3ac-42dc-ad4d-4d8a3a8ad4c5' ) A where A.rank=1

查询结果:
SQL server 中FIRST_VALUE函数和RANK函数_第4张图片
这里有一个需要注意的地方,两个函数使用后会多出两列,每一列都要取一个别名,否则会提示该列未指定

你可能感兴趣的:(数据库sql)