Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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
Java 我的查询需要很长时间才能完成,无法找到列值差为另一列的最大组的行对_Java_Sql_H2 - Fatal编程技术网

Java 我的查询需要很长时间才能完成,无法找到列值差为另一列的最大组的行对

Java 我的查询需要很长时间才能完成,无法找到列值差为另一列的最大组的行对,java,sql,h2,Java,Sql,H2,我有一张这样的桌子: 我想找出每节课表现差异最大的一对中心,如下所示: 我有以下疑问, 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 -

我有一张这样的桌子:

我想找出每节课表现差异最大的一对中心,如下所示:

我有以下疑问,

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
)
它可以工作,但需要很长时间,对于一个包含20列和200行的表需要几分钟。如何修改查询以更快地获得相同的输出?

使用行号:

或者为了更好的表现。最大差值是最大值减去最小值。如果需要中心,这里有一个没有子查询的方法:

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

只要你有一个关于性能和会话的索引就可以了。

按会话分组并获取组的最小和最大性能似乎是合乎逻辑的。 不幸的是,实际的中心在这里需要一个子查询/联接

select g.session as Session,
    (select min(center) from mytable
     where session = g.session and performance = g.maxim) as Center1,
    (select min(center) from mytable
     where session = g.session and performance = g.minim) as Center2,
    g.maxim - g.minim as Performance
from (select 
        t1.session,
        min(t1.performance) as minim,
        max(t1.performance) as maxim
    from mytable t1
    group by t1.session)
    as g

确保会话和性能的索引。

性能问题应包括解释和一些关于表大小、索引、当前时间性能、期望时间等的信息。慢速是一个相对术语,我们需要一个实际值进行比较。您的H2版本是什么?以文本形式发布表格和数据如果第1-B-88行与第1-B-96行相似,则在输出中,center1的值将是A或B?差异是否为负值?或者你想要绝对值?我的h2不支持行数,我有语法错误。@ManojBanik。从V1.4.198开始支持它。这是文档:。哇!这真的很快,就在几秒钟之内。从7分钟开始。谢谢。检查我的边境案件更新。记住,如果解决了问题,请将答案标记为正确。记住,若表增长得更大,那个么就创建索引。上一个版本有效,而这个版本无效。它说:T1列。找不到会话;如果您检查编辑历史记录,我没有编辑,只是添加了更多行。我编辑了注释掉了一些产生问题的行。我收到以下消息:org.h2.jdbc.JdbcSQLException:标量子查询包含多行;对于会话和性能,列查询未生成1行。添加了min以获取其中一个中心。H2数据库不支持此查询,我收到以下消息:H2数据库连接:运行时异常:无法准备查询:SQL语句中的语法错误@Sagar@ManojBanik此查询基于Postgresql。
select distinct(session) * from (
select  t1.session, t1.center, t2.center, 
(case when t1.performance > t2.performance then (t1.performance-t2.performance) else (t2.performance-t1.performance))as performance_diff 
from mytable t1, mytable t2 
where t1.session=t2.session and t1.center!=t2.center) as T1 order by session,performance_diff desc limit 1;
select g.session as Session,
    (select min(center) from mytable
     where session = g.session and performance = g.maxim) as Center1,
    (select min(center) from mytable
     where session = g.session and performance = g.minim) as Center2,
    g.maxim - g.minim as Performance
from (select 
        t1.session,
        min(t1.performance) as minim,
        max(t1.performance) as maxim
    from mytable t1
    group by t1.session)
    as g
select distinct(session) * from (
select  t1.session, t1.center, t2.center, 
(case when t1.performance > t2.performance then (t1.performance-t2.performance) else (t2.performance-t1.performance))as performance_diff 
from mytable t1, mytable t2 
where t1.session=t2.session and t1.center!=t2.center) as T1 order by session,performance_diff desc limit 1;