使用特定行的Id对行进行分组

时间:2017-11-07 14:42:32

标签: sql sql-server tsql

我一直试图解决这个问题,所以非常感谢这里的一些帮助。

基本上我有一个数据库表,例如:

enter image description here

我试图得到以下结果:

Id     | Name  | Total
------------------------
590954 | ABC   | 825.00

所以我需要该组中具有最大值的行(即ABC),名称和值的总和(对于该组 - ABC)。

还有更多行具有不同的名称。

提前致谢。

编辑(添加一些SQL来帮助):

declare     @Test       table
    (       Id          int
    ,       Name        nvarchar(20)
    ,       Value       decimal(10,2)
    )

insert into @Test values (590954, 'ABC', 525)
insert into @Test values (592332, 'ABC', 300)
insert into @Test values (1, 'DEF', 100)
insert into @Test values (2, 'DEF', 250)

select * from @Test

我试图获得的结果是这两行:

Id     | Name  | Total
------------------------
590954 | ABC   | 825.00
2      | DEF   | 350.00

请帮我写下所需的查询。

4 个答案:

答案 0 :(得分:4)

这通常使用row_number()

完成
select t.*
from (select t.*, row_number() over (partition by name order by value desc) as seqnum,
             sum(value) over (partition by name) as sumvalue
      from t
     ) t
where seqnum = 1;

答案 1 :(得分:4)

SQL DEMO

您可以尝试以下查询:

select t1.id, t1.name, t2.Total
from table1 t1
join(SELECT name, MAX(Value) as max_Value, SUM(Value) as Total
    FROM Table1 GROUP BY name) t2 
    on t1.name=t2.name and t1.Value=t2.max_Value

要理解查询:派生表别名为t2,其中包含字段name,最大ValueValue的总和每组。然后它与主表table1结合使用此条件t1.name=t2.name and t1.Value=t2.max_Value,确认只选择每个组中包含最大Value的记录。

答案 2 :(得分:2)

以下是与您的要求类似的示例代码

Error in (function (classes, fdef, mtable)  : 
unable to find an inherited method for function ‘dbWriteTable’ 
for signature ‘"MySQLConnection", "grouped_df", "character"’

答案 3 :(得分:1)

这可以使用Window功能完成。类似于Gordon Linoff的回答,但我更改了sum(value)中的分区以获得正确的答案:

    select t.*
    from (select t.*, row_number() over (partition by name order by value  desc) as seqnum,
         sum(value) over (partition by name) as sumvalue
    from @Test t
     ) t
    where seqnum = 1;