我需要在表格中的每个组中找到具有最高价值的行,例如,我想按照颜色和形状对以下内容进行分组,然后获取具有最高成本的行。例如。输入
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。
答案 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是示例中使用的表别名。