如何在SQL中为每个组选择最大行

10
我想选择具有“Value”最大值的'grpid'的国家。同时,在检查最大值时,已选择的“Country”不应考虑其他“grpid”(即结果中不应重复出现Country或grpid)。

SQL Fiddle

结果:

Country    grpid        Value           Row_number

US        49707        604456458         1
GB        5086         497654945         4 
CA        909          353500201         10
JP        231          198291290         15

http://social.msdn.microsoft.com/Forums/en-US/dc8f52e2-a03d-4183-bf35-dc2ab14f2632/how-to-select-a-max-row-for-each-group-in-sql?forum=transactsql - sajid
在结果中,国家或组别不应重复... 在您的结果中,“GB”和“US”正在重复。1)选择具有“grpid”的最大“Value”值的国家2)不应重复“grpid”和国家。3)如果没有“grpid”对于最高值,则我们需要采取下一个最大值。 - sajid
为什么你没有包括 **grpid '50147'**? - Prahalad Gaggar
3个回答

7

请尝试使用这个查询:

  WITH OrderedOrders AS
  (
     SELECT country,grpid,value,ROW_NUMBER() OVER(PARTITION BY country ORDER BY   country,value DESC) AS 'RowNumber' 
     FROM test1
  ) 
 select * from  OrderedOrders
 where RowNumber =1

对我来说完美地工作了。 - Michael K

6
我相信这就是您需要的内容:

SQL Fiddle


(注:原文已为中文,无需翻译)
;with cte as 
(
  select 
      country,
      max(value) as MaxVal,
      min(row_number) as MinRow
  from test1
  group by Country
)
select 
  c.country,
  t.grpid,
  c.MaxVal,
  c.MinRow
from cte c
join test1 t
  on t.country = c.country 
  and t.value = c.MaxVal
  and t.row_number = c.MinRow
order by country, grpid

简单的自连接通过展示如何使用with关键字是有用的,并且链接已更新。+1 - Soner from The Ottoman Empire

0

请尝试执行这个查询

select 
    country,
    value,
    grpid,
    count(*) 
from test1 
group by  
    country,
    value,
    grpid 
order by 
    country,
    value desc

谢谢,这个输出不行。结果:国家 grpid 值 行号美国 49707 604456458 1英国 5086 497654945 4加拿大 909 353500201 10日本 231 198291290 15在结果中,国家或grpid不应重复...在你的结果中,“GB”和“US”重复了。1)选择具有最大“Value”的“grpid”的国家。2)'grpid'和国家不应重复。3)如果没有“grpid”与最高值相对应,则需要取下一个最大值。 - sajid
在结果中,国家或组别不应重复... 在您的结果中,“GB”和“US”正在重复。1)选择具有“grpid”的最大“Value”值的国家2)不应重复“grpid”和国家。3)如果没有“grpid”对于最高值,则我们需要采取下一个最大值。 - sajid
请问您能否从分组和选择列表中删除国家并尝试一下? - sakthi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接