【问题标题】:get the record based on max value oracle multiple tables根据最大值oracle多个表获取记录
【发布时间】:2014-11-13 20:59:52
【问题描述】:

我遇到了 oracle 查询的问题。在此查询中,我想显示状态恢复,其中记录由 seq 列和外部列的最大值获取。这是我的查询:

select x.order_id, z.status_resume,
max(y.seq) as seq2,
max(y.extern_order_status) as extern
from t_order_demand x 
JOIN t_order_log y ON x.order_id=y.order_id
JOIN p_catalog_status z ON z.status_code_sc=y.extern_order_status
and x.order_id like '%1256%'
group by x.order_id, z.status_resume;

结果如下:
订单 ID    status_resume     seq    extern
1256 Proccess 2 4
1256     已注册              1      2
1256      预注册         0      1

我希望结果只是基于 seq 和 extern 的最大值的状态恢复。我该怎么做?帮帮我..谢谢。
订单 ID    status_resume     seq   extern
1256       进程              2     4

【问题讨论】:

    标签: database oracle max record


    【解决方案1】:
    WITH t AS
     (SELECT x.order_id
            ,z.status_resume
            ,MAX(y.seq) AS seq2
            ,MAX(y.extern_order_status) AS extern
      FROM   t_order_demand x
      JOIN   t_order_log y
      ON     x.order_id = y.order_id
      JOIN   p_catalog_status z
      ON     z.status_code_sc = y.extern_order_status
      AND    x.order_id LIKE '%1256%'
      GROUP  BY x.order_id
               ,z.status_resume)
    SELECT *
    FROM   t
    WHERE  (t.seq || t.extern) = (SELECT MAX(tt.seq || tt.extern) FROM t tt);
    

    可能对你有用。

    【讨论】:

    • 非常感谢@ZsoltBotykai .. 我在这里编辑了一些东西 "(t.seq2 || t.extern) IN (SELECT MAX(tt.seq2 || tt.extern) FROM t tt);" .非常感谢
    【解决方案2】:
    WITH data AS 
    ( 
             SELECT   x.order_id, 
                      z.status_resume, 
                      Max(y.seq)                 AS seq2, 
                      Max(y.extern_order_status) AS extern 
             FROM     t_order_demand x 
             join     t_order_log y 
             ON       x.order_id=y.order_id 
             join     p_catalog_status z 
             ON       z.status_code_sc=y.extern_order_status 
             AND      x.order_id LIKE '%1256%' 
             GROUP BY x.order_id, 
                      z.status_resume ) 
    SELECT * 
    FROM   data 
    WHERE  seq || extern = 
    (select max(seq || extern) 
    FROM   data)
    /
    

    一个简单的验证测试用例:

    SQL> WITH DATA AS(
      2  SELECT 1 col1, 2 col2 FROM dual UNION ALL
      3  SELECT 5, 7 FROM dual
      4  )
      5  SELECT * FROM DATA
      6  where col1||col2 = (select max(col1||col2) from data)
      7  /
    
          COL1       COL2
    ---------- ----------
             5          7
    
    SQL>
    

    【讨论】:

      【解决方案3】:

      你可以使用解析函数RANK:

      select order_id, status_resume, seq2, extern 
      from (
          select x.order_id, z.status_resume,
                 max(y.seq) as seq2,
                 max(y.extern_order_status) as extern,
                 rank() over(partition by x.order_id, z.status_resume order by max(y.seq) desc, max(y.extern_order_status) desc) rnk
          from t_order_demand x 
          JOIN t_order_log y ON x.order_id=y.order_id
          JOIN p_catalog_status z ON z.status_code_sc=y.extern_order_status
          and x.order_id like '%1256%'
          group by x.order_id, z.status_resume
      ) where rnk = 1;
      

      但不清楚您所说的最多两个字段是什么意思。有总和?上面的查询检索带有max seq 的行,如果多行具有相同的seq,则只检索带有max extern_order_status 的行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-31
        • 2020-11-11
        • 2016-05-25
        • 1970-01-01
        相关资源
        最近更新 更多