Sql server 简单t-sql:比三重连接更简单的解决方案
根据这张表… 上面是表的一个示例,但具有代表性,我想返回下一个结果:应按VisId分组,我需要返回:基于日期时间的第一个prop11,基于日期时间的第一个非“根”prop11,以及基于日期时间的最后一个prop11 所以对于这种情况,我需要在一行中返回:'Root','Mkge','Root'。一行三列。我怎样才能做到这一点? 我通过三重自联接实现了这一点,但我认为可能有一种更有效的方法。使用具有多个s的a和条件聚合:Sql server 简单t-sql:比三重连接更简单的解决方案,sql-server,tsql,Sql Server,Tsql,根据这张表… 上面是表的一个示例,但具有代表性,我想返回下一个结果:应按VisId分组,我需要返回:基于日期时间的第一个prop11,基于日期时间的第一个非“根”prop11,以及基于日期时间的最后一个prop11 所以对于这种情况,我需要在一行中返回:'Root','Mkge','Root'。一行三列。我怎样才能做到这一点? 我通过三重自联接实现了这一点,但我认为可能有一种更有效的方法。使用具有多个s的a和条件聚合: ;with cte as ( select * , rn_as
;with cte as (
select *
, rn_asc = row_number() over (partition by VisId order by date_time asc)
, rn_desc = row_number() over (partition by VisId order by date_time desc)
, rn_mkge = case when prop11 <> 'Root'
then row_number() over (partition by VisId order by date_time asc)
end
from t
)
select
VisId
, FirstProp = max(case when rn_asc = 1 then date_time end)
, FirstNonRoot = max(case when rn_mkge = 1 then date_time end)
, LastProp = max(case when rn_desc = 1 then date_time end)
from cte
group by VisId
这里需要一些文本样本数据和更清晰的规范。也就是说,根据您给出的规范,第一列和第三列不都是根吗?如果不是,请概述情况,例如,如果第一个prop11值不等于root,则第一个prop11可能会被null替换?这里是一个很好的起点。正如张贴的,这是不负责任的。
select
VisId
, FirstProp = max(case when rn_asc = 1 then date_time end)
, FirstNonRoot = max(case when rn_mkge = 1 then date_time end)
, LastProp = max(case when rn_desc = 1 then date_time end)
from (
select *
, rn_asc = row_number() over (partition by VisId order by date_time asc)
, rn_desc = row_number() over (partition by VisId order by date_time desc)
, rn_mkge = case when prop11 <> 'Root'
then row_number() over (partition by VisId order by date_time asc)
end
from t
) s
group by VisId