oracle 如何获得最大值

iugsix8n  于 2023-04-05  发布在  Oracle
关注(0)|答案(2)|浏览(163)

我有一个问题,我试图以最方便的方式聚合结果。
假设我正在查询的表有6列与我相关,列a到f;d列和e列是时间,f列是alpha值,我认为它与本练习无关
我当前的查询是

select * from mytable where b in (list of values)

问题是最好出现多次

  • a(primary key)
  • 和c(来自不同表的主键

我想做的是按列b分组,但只返回每个b的最大值为c的行

我的查询是select b, max(c) from table where b in (range) group by b
每当我尝试添加其他列时,都会得到如下错误
'不是GROUP BY表达式'
但我只想按b分组
在这个表中,我想返回的是
| A(id)|B(分组依据)|C(id_other max)|
| --------------|--------------|--------------|
| 五|1|九|
| 10个|第二章|十二岁|
| 十五岁|三|六|
| 二十|四|10个|
沿着其他列d到f,但我不认为他们的价值观是相关的,如果他们是,请让我知道.我一直在通过大量的网站和书籍寻找指导关于最大和组由,但还没有能够弄清楚这一点.请让我知道,如果我需要提供一些额外的信息.谢谢!
我尝试了类似于select B,max(c),a,d,e,f from table where b in(range)group by b的方法,但不起作用

zour9fqk

zour9fqk1#

只要没有多个相同的c,就可以使用

select t1.* 
from table1 t1 JOIN (SELECT b, MAX(c) max_C FROM table1) t2 
ON t1.b = t2.b AND t1.c = t2.max_c

或者如果您的数据库支持cte和窗口函数,并且您有多个相同的c

WITH CTE as    
(select t1.*, ROW_NUMBER() OVER(PARTITION BY b ORDER BY c DESC,a DESC) rn
    from table1 t1)
SELECT a,b,c FROM CTE WHERE rn = 1
yhived7q

yhived7q2#

对于sql-server,我创建了这个sql-fiddle
创建一个简单的表

CREATE TABLE my_table (
    A_id int, B int, C_id int
);

给它添加一些数据

-- group by b but select only record where c is max
INSERT INTO my_table (A_id, B, C_id)  VALUES (1,2,3);
INSERT INTO my_table (A_id, B, C_id)  VALUES (2,2,4); -- this c_id=4 or
INSERT INTO my_table (A_id, B, C_id)  VALUES (3,2,4); -- that c_id=4 or both?
INSERT INTO my_table (A_id, B, C_id)  VALUES (4,3,40);
INSERT INTO my_table (A_id, B, C_id)  VALUES (5,3,41); 
INSERT INTO my_table (A_id, B, C_id)  VALUES (6,3,42); -- only this 
INSERT INTO my_table (A_id, B, C_id)  VALUES (7,4,50);
INSERT INTO my_table (A_id, B, C_id)  VALUES (8,4,51);
INSERT INTO my_table (A_id, B, C_id)  VALUES (9,4,52); -- only this

上面的插入创建了这些记录

然后查询数据

SELECT my_table.A_id, sq.B, sq.C_Max FROM 
   (SELECT B, Max(C_id) as C_Max FROM my_table GROUP BY B) as sq
LEFT JOIN my_table ON sq.B = my_table.B AND sq.C_Max = my_table.C_id;

这部分SELECT B, Max(C_id) as C_Max FROM my_table GROUP BY B获取C_id具有最高值且仅包括列B和C的所有记录。此结果可用于将结果与表本身连接以查找匹配行。

相关问题