My query is taking too long to finish for finding the pair of rows where the difference of columns value is maximum group by another column

后端 未结 4 1293
醉话见心
醉话见心 2021-01-26 19:10

Say, I\'ve a table like this:

I want to find the pair of Centers whose Performance difference is highest for each session, like this:

I have th

4条回答
  •  庸人自扰
    2021-01-26 19:42

    Use row_number():

    select session, center1, center2, performance
    from (select t1.center as center1, t2.center as center2,
                 (t1.performance - t2.performance) as performance,
                 row_number() over (partition by t1.session order by (t1.performance - t2.performance) desc) as seqnum
          from mytable t1 join
               mytable t2
               on t1.session = t2.session
    where seqnum = 1;
    

    Or for better performance. The maximum difference is the maximum minus the minimum. You want the centers, here is a method without subqueries:

    select session,
           max(case when seqnum_desc = 1 then center end) as center1,
           max(case when seqnum_asc = 1 then center end) as center2,
           max(performance) - min(performance)
    from (select t.*,
                 row_number() over (partition by session order by performance) as seqnum_asc,
                 row_number() over (partition by session order by performance desc) as seqnum_desc
          from mytable t
    where 1 in (seqnum_asc, seqnum_desc)
    group by session
    

提交回复
热议问题