返回每组中排名最高的行

时间:2015-09-01 00:10:24

标签: sql tsql plsql

我需要在表格中的每个组中找到具有最高价值的行,例如,我想按照颜色和形状对以下内容进行分组,然后获取具有最高成本的行。例如。输入

ID Color Shape    Cost
-- ----- -----    ----
1  Red   Round    45
2  Red   Round    18
3  Red   Square   13
4  Red   Square   92
5  Green Round    25
6  Green Round    21
7  Green Triangle 20
8  Green Triangle 33

我想要

ID Color Shape    Cost
-- ----- -----    ----
1  Red   Round    45
4  Red   Square   92
5  Green Round    25
8  Green Triangle 33

我该怎么做?对PL / SQL和T / SQL起作用的东西太棒了,尽管我的需求是PL / SQL。

4 个答案:

答案 0 :(得分:4)

您可以使用row_number对颜色和形状进行分区,然后将1作为行号分配给该分区中的最高成本。

select id,color,shape,cost
from
(
select *, 
row_number() over(partition by color,shape order by cost desc) as rn
from tablename
) t 
where rn = 1;

答案 1 :(得分:0)

如果您正在寻找问题的真正基本解决方案,那么您最好的选择就在下面。这几乎适用于任何SQL变体。

也相信与否,这比flash' row_number()'更快。版。 但我们正在谈论微秒。所以它只是一个偏好的问题。

下面的工作示例

DECLARE @Data TABLE (ID INT,Colour NVARCHAR(16),Shape NVARCHAR(16),Cost INT)
INSERT INTO @Data
VALUES
(1,'Red'  ,'Round',   45),
(2,'Red'  ,'Round',   18),
(3,'Red'  ,'Square',  13),
(4,'Red'  ,'Square',  92),
(5,'Green','Round',   25),
(6,'Green','Round',   21),
(7,'Green','Triangle',20),
(8,'Green','Triangle',33)

SELECT      D.ID,
            D.Colour,
            D.Shape,
            G.Cost
FROM        @Data AS D
INNER JOIN
(
    SELECT      Colour,Shape,MAX(Cost) AS Cost
    FROM        @Data
    GROUP BY    Colour,Shape
) AS G ON G.Colour = D.Colour AND G.Shape = D.Shape AND G.Cost = D.Cost

答案 2 :(得分:0)

如果您设置了表格,这应该是一个直接的SELECT语句 - 我们称之为table_a:

SELECT id, color, shape, max(cost) as Cost
from table_a
group by id, color, shape

不确定输出是否允许在输出中大写Cost - 有时这取决于您的SQL语法。 (例如,在IMPALA SQL中不可能)

答案 3 :(得分:0)

这也可以使用共同相关的子查询来完成,如下所示:

select id,color,shape,cost 
from ex_1 a where cost = (select max(cost) 
                      from ex_1 b 
                      where a.shape = b.shape 
                      and a.color = b.color) 

我将表命名为ex_1,有8个条目,a,b是示例中使用的表别名。