简单的t-sql:比三连接更容易解决

时间:2017-03-20 15:40:13

标签: sql-server tsql

基于此表... enter image description here

以上是该表的一个示例,但是具有代表性,我想返回下一个结果:(应该按VisId分组),我需要返回:第一个prop11(基于date_time),第一个非'root'prop11(基于date_time)和最后一个prop11(基于date_time)。

因此,对于这种情况,我需要在一行中返回:'Root','Mkge','root'。 (在一行中,3列)。我怎样才能做到这一点? (我用三重自联接实现了它,但我认为可能有一种更高效的方式)。

1 个答案:

答案 0 :(得分:0)

使用common table expression多个row_number()和条件聚合:

cte

没有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

res3 = summary_col([res1,res2],stars=True,float_format='%0.2f',
              info_dict={'R2':lambda x: "{:.2f}".format(x.rsquared)})
f = open('res3.tex', 'w')
f.write(res3.as_latex())
f.close()