使用 Max() 函数对值进行 select 分组
Using Max() function to select group values
我有一个 table 这样的:
SKU ITEM VALUE
1503796 1851920 0,9770637
1503796 1636691 0,9747891
1503796 1503781 0,9741025
1503796 3205763 0,9741025
1503801 1999745 0,9776622
1503801 1999723 0,9718825
1503801 3651241 0,9348839
1503801 1773569 0,9331309
1503811 1439825 0,97053134
1503811 1636684 0,96297866
1503811 1636671 0,96003973
1503811 1600553 0,9535771
1503818 1636708 0,9440251
1503818 1636709 0,9440251
1503818 1779789 0,9423958
1503818 3322310 0,9369579
我需要得到这样的输出(按最大值分组):
SKU ITEM VALUE
1503796 1851920 0,9770637
1503801 1999745 0,9776622
1503811 1439825 0,97053134
1503818 1636708 0,9440251
试过这样使用:
select SKU, ITEM, VALUE from import
where value=(select max(value) from import )
但它 select 只有一行具有最大值。如何重写查询?
使用常见的 table 表达式
WITH CTE AS
(SELECT SKU,ITEM,VALUE,
ROW_NUMBER() OVER (PARTITION BY SKU ORDER BY value DESC)as maxvalue
FROM import)
SELECT SKU,ITEM,VALUE FROM CTE WHERE maxvalue=1
用 ROW_NUMBER 对记录进行排名,以便 sku 的最大值获得#1。然后只保留那些排名第一的记录。
select sku, item, value
from
(
select
mytable.*
row_number() over (partition by sku order by value desc) as rn
from mytable
)
where rn = 1;
对于 SKU 1503818,您将获得以下两种之一:
1503818 1636708 0,9440251
1503818 1636709 0,9440251
如果您想要一个特定的(例如,商品编号较高的那个),请将此条件添加到 Row_Number 的 ORDER BY 子句中。
至于您自己尝试的查询:您应该寻找 sku-value 对:
select SKU, ITEM, VALUE from import
where (sku,value) in (select sku, max(value) from import group by sku);
如果出现平局,例如 SKU 1503818,此查询将为您提供两条记录。
您可以将 ... KEEP ( DENSE_RANK ... )
与聚合函数一起使用以获得不同行的最大值:
SELECT SKU,
MAX( ITEM ) KEEP ( DENSE_RANK LAST ORDER BY VALUE ASC ) AS ITEM,
MAX( VALUE ) AS VALUE
FROM IMPORT
GROUP BY SKU;
我有一个 table 这样的:
SKU ITEM VALUE
1503796 1851920 0,9770637
1503796 1636691 0,9747891
1503796 1503781 0,9741025
1503796 3205763 0,9741025
1503801 1999745 0,9776622
1503801 1999723 0,9718825
1503801 3651241 0,9348839
1503801 1773569 0,9331309
1503811 1439825 0,97053134
1503811 1636684 0,96297866
1503811 1636671 0,96003973
1503811 1600553 0,9535771
1503818 1636708 0,9440251
1503818 1636709 0,9440251
1503818 1779789 0,9423958
1503818 3322310 0,9369579
我需要得到这样的输出(按最大值分组):
SKU ITEM VALUE
1503796 1851920 0,9770637
1503801 1999745 0,9776622
1503811 1439825 0,97053134
1503818 1636708 0,9440251
试过这样使用:
select SKU, ITEM, VALUE from import
where value=(select max(value) from import )
但它 select 只有一行具有最大值。如何重写查询?
使用常见的 table 表达式
WITH CTE AS
(SELECT SKU,ITEM,VALUE,
ROW_NUMBER() OVER (PARTITION BY SKU ORDER BY value DESC)as maxvalue
FROM import)
SELECT SKU,ITEM,VALUE FROM CTE WHERE maxvalue=1
用 ROW_NUMBER 对记录进行排名,以便 sku 的最大值获得#1。然后只保留那些排名第一的记录。
select sku, item, value
from
(
select
mytable.*
row_number() over (partition by sku order by value desc) as rn
from mytable
)
where rn = 1;
对于 SKU 1503818,您将获得以下两种之一:
1503818 1636708 0,9440251 1503818 1636709 0,9440251
如果您想要一个特定的(例如,商品编号较高的那个),请将此条件添加到 Row_Number 的 ORDER BY 子句中。
至于您自己尝试的查询:您应该寻找 sku-value 对:
select SKU, ITEM, VALUE from import
where (sku,value) in (select sku, max(value) from import group by sku);
如果出现平局,例如 SKU 1503818,此查询将为您提供两条记录。
您可以将 ... KEEP ( DENSE_RANK ... )
与聚合函数一起使用以获得不同行的最大值:
SELECT SKU,
MAX( ITEM ) KEEP ( DENSE_RANK LAST ORDER BY VALUE ASC ) AS ITEM,
MAX( VALUE ) AS VALUE
FROM IMPORT
GROUP BY SKU;