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
查问后果:
这里有一个须要留神的中央,两个函数应用后会多出两列,每一列都要取一个别名,否则会提醒该列未指定
发表回复