Sql 按指定返回所有捐赠者的最高总和值

Sql 按指定返回所有捐赠者的最高总和值,sql,oracle,sum,row-number,Sql,Oracle,Sum,Row Number,我有以下脚本: SELECT DISTINCT GIFT_ID, GIFT_DESG, SUM(GIFT_AMT) FROM GIFT_TABLE GROUP BY GIFT_ID, GIFT_DESG 它会返回如下内容: GIFT_ID GIFT_DESG SUM(GIFT_AMT) 1 A 25 1 B 500 1

我有以下脚本:

SELECT DISTINCT GIFT_ID, GIFT_DESG, SUM(GIFT_AMT)
FROM GIFT_TABLE
GROUP BY GIFT_ID, GIFT_DESG
它会返回如下内容:

GIFT_ID         GIFT_DESG      SUM(GIFT_AMT)
      1                A               25
      1                B              500
      1                C               75
      2                A              100
      2                B              200
      2                C              300
      ...
我期望的结果是:

GIFT_ID         GIFT_DESG      SUM(GIFT_AMT)
      1                B           500
      2                C           300
我该怎么做

可能是第()行,对吗?我认为这是一种通过命名来计算礼物金额的方法,这让我很反感


多谢各位

如果您的DBMS支持
ROW\u NUMBER
窗口功能,您可以尝试通过
GIFT\u ID
order by
SUM(GIFT\u AMT)
创建行号,然后获取
rn=1

SELECT t1.GIFT_ID,t1.GIFT_DESG,t1.GIFT_AMT 
FROM (
    SELECT t1.*,ROW_NUMBER() OVER(PARTITION BY GIFT_ID ORDER BY GIFT_AMT DESC) rn
    FROM (
      SELECT  GIFT_ID, GIFT_DESG, SUM(GIFT_AMT) GIFT_AMT
      FROM GIFT_TABLE
      GROUP BY GIFT_ID, GIFT_DESG
    ) t1
) t1
where rn =1
注意

您已经使用了
groupby
关键字
DISTINCT
没有意义,您可以将其从查询中删除


这是一个样本

CREATE TABLE T(
   GIFT_ID int,
   GIFT_DESG varchar(5),
  GIFT_AMT int
);


insert into t values (1,'A' ,25);
insert into t values (1,'B' ,500);
insert into t values (1,'C' ,75);
insert into t values (2,'A' ,100);
insert into t values (2,'B' ,200);
insert into t values (2,'C' ,300);
查询1

SELECT t1.GIFT_ID,t1.GIFT_DESG,t1.GIFT_AMT 
FROM (
    SELECT t1.*,ROW_NUMBER() OVER(PARTITION BY GIFT_ID ORDER BY GIFT_AMT DESC) rn
    FROM T t1
) t1
where rn =1
| GIFT_ID | GIFT_DESG | GIFT_AMT |
|---------|-----------|----------|
|       1 |         B |      500 |
|       2 |         C |      300 |

SELECT t1.GIFT_ID,t1.GIFT_DESG,t1.GIFT_AMT 
FROM (
    SELECT t1.*,ROW_NUMBER() OVER(PARTITION BY GIFT_ID ORDER BY GIFT_AMT DESC) rn
    FROM T t1
) t1
where rn =1
| GIFT_ID | GIFT_DESG | GIFT_AMT |
|---------|-----------|----------|
|       1 |         B |      500 |
|       2 |         C |      300 |

您可以在没有子查询的情况下执行此操作:

SELECT TOP (1) WITH TIES GIFT_ID, GIFT_DESG, SUM(GIFT_AMT)
FROM GIFT_TABLE
GROUP BY GIFT_ID, GIFT_DESG
ORDER BY ROW_NUMBER() OVER (PARTITION BY GIFT_ID ORDER BY SUM(GIFT_AMT) DESC);

你也可以这样做

WITH t as
   SELECT GIFT_ID, GIFT_DESG, SUM(GIFT_AMT) AS GIFT_AMT
   FROM GIFT_TABLE
   GROUP BY GIFT_ID, GIFT_DESG)
SELECT  GIFT_ID, 
   max(GIFT_DESG) KEEP (DENSE_RANK LAST ORDER BY GIFT_AMT), 
   max(GIFT_AMT) GIFT_AMT
FROM T
GROUP BY GIFT_ID;

无需在此处执行SELECT DISTINCT,您的GROUP BY不会返回重复项。您使用的是哪种dbms?嗨,jarlh,Oracle 11g。您没有“脚本”,您有一个查询。(它在脚本中吗?你没有显示出来。)不是每个代码段都是“脚本”。