Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 简单t-sql:比三重连接更简单的解决方案_Sql Server_Tsql - Fatal编程技术网

Sql server 简单t-sql:比三重连接更简单的解决方案

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

根据这张表…

上面是表的一个示例,但具有代表性,我想返回下一个结果:应按VisId分组,我需要返回:基于日期时间的第一个prop11,基于日期时间的第一个非“根”prop11,以及基于日期时间的最后一个prop11

所以对于这种情况,我需要在一行中返回:'Root','Mkge','Root'。一行三列。我怎样才能做到这一点? 我通过三重自联接实现了这一点,但我认为可能有一种更有效的方法。

使用具有多个s的a和条件聚合:

;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