关于数据库:SQL-server-中FIRSTVALUE函数和RANK函数

38次阅读

共计 1632 个字符,预计需要花费 5 分钟才能阅读完成。

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

查问后果:

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

正文完
 0