1个具有最大值的不同行

时间:2019-04-18 22:17:53

标签: sql oracle

这是我拥有的数据

enter image description here

我需要具有最大价格的唯一ID(1行)。因此,输出为:

enter image description here

我尝试了以下

select * from table a
join (select b.id,max(b.price) from table b
group by b.id) c on c.id=a.id;

将问题作为输出,因为没有键。我也尝试了其他where条件,从而将原始表作为输出。

1 个答案:

答案 0 :(得分:1)

您可以在SQL Server中尝试以下操作:

表格

create table ex1 (
    id int, 
    item char(1),
    price int,
    qty int,
    usr char(2)
);

数据

insert into ex1 values
(1, 'a', 7, 1, 'ab'),
(1, 'a', 7, 2, 'ac'),
(2, 'b', 6, 1, 'ab'),
(2, 'b', 6, 1, 'av'),
(2, 'b', 5, 1, 'ab'),
(3, 'c', 5, 2, 'ab'),
(4, 'd', 4, 2, 'ac'),
(4, 'd', 3, 1, 'av');

查询

select a.* from ex1 a
join (
    select id, max(price) as maxprice, min(usr) as minuser
    from ex1
    group by id
) c
    on c.id = a.id
    and a.price = c.maxprice
    and a.usr = c.minuser
order by a.id, a.usr;

结果

id  item price qty  usr
1   a     7    1    ab
2   b     6    1    ab
3   c     5    2    ab
4   d     4    2    ac

说明

在您的数据集中,ID 1有2条价格相同的记录。您必须决定要选择哪个。因此,在上面的示例中,我为姓名按字母顺序排列的最低用户显示了一条记录。

替代方法

SQL Server具有也可以使用的排名功能row_number over()

select * from (
    select row_number() over( partition by id order by id, price desc, usr) as sr, *
    from ex1
) c where sr = 1;

子查询说-给我表中的所有记录,并给每行一个序列号,每个ID均以1开头。这些行应先按ID排序,然后按价格降序排列,然后按usr排序。外部查询会选择sr号为1的记录。

此处的示例:https://rextester.com/KZCZ25396