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