首页 > 解决方案 > GROUP BY 和 ORDER BY ASC & DESC

问题描述

我有一张表,spa其中包含我需要的大部分信息:

水疗表结果预览

我加入另一张桌子 ,client来抢占last_name场地:

客户表结果预览

我需要的是为每个and和最后一个room_code获得第一个, service_detail, & 。provider_start_timesba_dateprovider_code provider_end_time

以我的图像为例,预期的结果是:

预期结果预览

标签: sqlsql-servergroup-bysql-order-by

解决方案


我认为这可以通过窗口函数来完成,row_number()并且last_value()

select
    room_code,
    service_detail,
    sba_date,
    provider_start_time,
    provider_end_time,
    last_name
from (
    select 
        s.*,
        c.last_name,
        row_number() over(
            partition by s.sba_date, s.provider_code
            order by s.provider_start_time
        ) rn,
        last_value(provider_end_time) over(
            partition by s.sba_date, s.provider_code
            order by s.provider_start_time
            range between unbounded preceding and unbounded following
        ) provider_end_time
    from spa s
    inner join client c on c.client_code = s.provider_code
) t
where rn = 1

sba_date内部查询连接两个表,并对具有相同和的记录组中的记录进行provider_code升序排列provider_start_time;它还计算provider_end_time同一组内的最后一个值。然后,外部查询过滤每个组中的第一条记录。


推荐阅读