关于数据库:SQL-server-中FIRSTVALUE函数和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'

查问后果:

想找出不同的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' 

查问后果:

通过查问后果能够看到,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' 

查问后果:

而后咱们只须要再加一个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

查问后果:

这里有一个须要留神的中央,两个函数应用后会多出两列,每一列都要取一个别名,否则会提醒该列未指定

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理