SQL查询以从列中获取最大值,但同时保留另一列,该列不是group by的一部分

SQL查询以从列中获取最大值,但同时保留另一列,该列不是group by的一部分,sql,oracle,Sql,Oracle,我正在尝试获取v_id上w_成本的最大值,如果w_成本为空,则获取r_成本并列出下表中给出的结果。当group by在v_id上时,如何获取v_id以获取最大w_成本 s_id sg_id r_cost w_cost av_id v_id 123 100 0.50 1.00 1 333 123 105 0.75 0 2 333 123 330 1.00 Null 3 888 最终结果应该是: s_i

我正在尝试获取v_id上w_成本的最大值,如果w_成本为空,则获取r_成本并列出下表中给出的结果。当group by在v_id上时,如何获取v_id以获取最大w_成本

s_id sg_id  r_cost  w_cost  av_id v_id
123  100    0.50    1.00    1     333
123  105    0.75    0       2     333
123  330    1.00    Null    3     888
最终结果应该是:

s_id v_id   w_cost  av_id
123  333     1.00   1
123  888     1.00   3

如果您的SQL支持分析功能,我会这样做

SELECT
  s_id,
  v_id,
  MAX(CASE WHEN w_cost IS NULL THEN r_cost ELSE w_cost END) OVER (PARTITION BY v_id) AS w_cost,
  av_id
FROM [YOUR_TABLE]
在这个查询中,您不需要按v_id分组

希望它能像这样有所帮助

SQL> with test (s_id, sg_id, r_cost, w_cost, av_id, v_id) as
  2  (select 123, 100, 0.5, 1, 1, 333 from dual union all
  3   select 123, 105, 0.75, 0, 2, 333 from dual union all
  4   select 123, 330, 1, null, 3, 888 from dual
  5  )
  6  select t.s_id,
  7         t.v_id,
  8         max(nvl(t.w_cost, t.r_cost)) w_cost,
  9         (select t1.av_id
 10          from test t1
 11          where nvl(w_cost, r_cost) = (select max(nvl(t2.w_cost, t2.r_cost))
 12                                       from test t2)
 13            and t1.s_id = t.s_id
 14            and t1.v_id = t.v_id
 15         ) av_id
 16  from test t
 17  group by t.s_id, t.v_id
 18  order by 1, 2;

      S_ID       V_ID     W_COST      AV_ID
---------- ---------- ---------- ----------
       123        333          1          1
       123        888          1          3

SQL>

我从您的描述中了解到(不幸的是,您的示例模棱两可),类似这样的内容可能会做到:

SELECT S_ID,
       V_ID,
       W_COST,
       AV_ID
       FROM (SELECT S_ID,
                    V_ID,
                    COALESCE(W_COST, R_COST) W_COST,
                    AV_ID,
                    ROW_NUMBER() OVER (PARTITION BY V_ID
                                       ORDER BY COALESCE(W_COST, R_COST) DESC) RN
                    FROM ELBAT)
       WHERE RN = 1;
它得到一行,
COALESCE(W\u COST,R\u COST)
是所有
V\u ID
的最高值。如果有更多的行具有最大值,则只随机选择其中一行(如果您需要领带,请将
ROW\u NUMBER()
替换为
RANK()
)<代码>合并(W_成本,R_成本)使用
R_成本
,如果
W_成本为空
,则
W_成本
。输出中名为
W\u COST
的列也显示了
COALESCE(W\u COST,R\u COST)
(否则,如果它直接显示
W\u COST
,那么它将在
V\u ID
等于
888
的行中显示
NULL

我想你想要:

select t.*
from t
where (s_id, v_id, coalesce(w_cost, r_cost)) in (
          select s_id, v_id, max(coalesce(w_cost, r_cost))
          from t
          group by s_id, v_id
         );

谢谢,但它应该只返回2行。