首页 > 解决方案 > 如何将选择上的最大/最小日期列与上一个日期的数据连接起来

问题描述

我必须加入一个带有 2 个参数的表以显示详细信息的最后更新状态,以检查 MAX(...)/MIN(...) 的完成/正在进行。我能为此做些什么?

我试过 LEFT JOIN 但它返回 null

SELECT a.showonly 
     , a.want_this_parameter_lastdate
     , min(a.xdate) start
     , max(a.xdate) stop
     , b.lastdate
  FROM samedatabase a
       LEFT JOIN (SELECT xdate lastdate
                       , want_this_parameter_lastdate 
                    FROM samedatabase 
                   WHERE ROWNUM = 1 
                  ORDER BY xdate DESC) b
              ON a.want_this_parameter_lastdate = b.want_this_parameter_lastdate
 WHERE something IN (SELECT DISTINCT equalsomething 
                       FROM another WHERE input like '...') 
   AND xdate> sysdate - 7
GROUP BY a.showonly, a.want_this_parameter_lastdate, b.lastdate
ORDER BY start ASC;

在我查询后我得到了这个

showonly|want_this_parameter|start  |stop   |lastdate
a1      |b1*                |5/7/19 |6/7/19 |(null)
a2      |b2**               |6/7/19 |7/7/19 |(null)
a3      |b1*                |7/7/19 |8/7/19 |(null)
a4      |b2**               |9/7/19 |10/7/19|(null)
a5      |b4                 |10/7/19|11/7/19|(null)

我期待这一点(stop是 a1 中使用的最后 b1 ,lastdate是所有表中使用的最后 b1 )

showonly|want_this_parameter|start  |stop   |lastdate
a1      |b1*                |5/7/19 |6/7/19 |12/17/19--Last B1 used
a2      |b2**               |6/7/19 |7/7/19 |11/17/19--Last B2 used
a3      |b1*                |7/7/19 |8/7/19 |12/17/19--Last B1 used
a4      |b2**               |9/7/19 |10/7/19|12/17/19--Last B2 used
a5      |b4                 |10/7/19|11/7/19|12/17/19--Last B4 used

*Same b1
**Same b2

更新 我终于明白了,但仍然担心查询性能的时间,因为 MAX(...) 将获取整个表对吗?我怎样才能提高这个性能。

SELECT a.showonly
     , a.want_this_parameter_lastdate
     , min(a.xdate) start
     , max(a.xdate) stop
     , b.lastdate
  FROM samedatabase a 
       LEFT JOIN (SELECT MAX(xdate) lastdate, want_this_parameter_lastdate 
                    FROM samedatabase 
                  GROUP BY want_this_parameter_lastdate) b
              ON a.want_this_parameter_lastdate = b.want_this_parameter_lastdate
 WHERE something IN (SELECT DISTINCT equalsomething 
                       FROM another 
                      WHERE input like '...') 
   AND xdate> sysdate - 7
GROUP BY a.showonly, a.want_this_parameter_lastdate, b.lastdate
ORDER BY start ASC;

标签: sqloracleoracle11g

解决方案


我认为简单的子查询会使工作更快,这样你就可以消除双重分组,这不是必需的:

select showonly, parameter, min(xdate) min_dt, max(xdate) max_dt,
       (select max(xdate) from samedatabase where parameter = s1.parameter) lst_dt
  from samedatabase s1
  where xdate > sysdate - 7
    and something in (select equalsomething from another where input like 'i%')
  group by showonly, parameter

dbfiddle 演示


推荐阅读