Как найти пару строк, в которых разница значений столбцов является максимальной группой по некоторому значению столбца - PullRequest
1 голос
/ 11 ноября 2019

У меня есть таблица, подобная следующей,

Я хочу найти пару центров, у которых разница в производительности максимальна для каждой сессии,Итак, мне нужна таблица, подобная следующей:

Я пытаюсь сформировать правильный запрос для базы данных h2.

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

H2 может быть немного сложнее. Я думаю, что это делает то, что вы хотите:

select t.session,
       max(case when performance = min_performance then center end) as center_1,
       max(case when performance = max_performance then center end) as center_2,
       (max_performance - min_performance) as performance_difference
from (select t.*
             min(performance) over (partition by session) as min_performance,
             max(performance) over (partition by session) as max_performance
      from t
     ) t
group by t.session, min_performance, max_performance;
1 голос
/ 11 ноября 2019

Вы можете самостоятельно присоединиться к таблице и использовать коррелированный подзапрос для фильтрации:

select 
    t1.session,
    t1.center center1,
    t2.center center2,
    t1.performance - t2.performance performance
from mytable t1
inner join mytable t2 on t1.session = t2.session
where t1.performance - t2.performance = (
    select max(t11.performance - t22.performance)
    from mytable t11
    inner join mytable t22 on t11.session = t22.session
    where t11.session = t1.session
)

Или вы можете использовать оконные функции:

select *
from (
    select 
        t1.session,
        t1.center center1,
        t2.center center2,
        t1.performance - t2.performance performance,
        rank() over(partition by t1.session order by t1.performance - t2.performance desc)rn
    from mytable t1
    inner join mytable t2 on t1.session = t2.session
) t
where rn = 1
...