SQL查询以从列中获取最大值,但同时保留另一列,该列不是group by的一部分
我正在尝试获取v_id上w_成本的最大值,如果w_成本为空,则获取r_成本并列出下表中给出的结果。当group by在v_id上时,如何获取v_id以获取最大w_成本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
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行。