Вернуть самое высокое значение СУММ всех доноров по обозначениям - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующий скрипт:

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

Как бы я это сделал?

Возможно row_number (), верно? Я думаю, что это что-то с суммированием сумм подарков по назначению, которое сбивает меня с толку.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Вы можете сделать это без подзапроса:

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);
0 голосов
/ 31 августа 2018

Вы можете сделать это так же, как это

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;
0 голосов
/ 31 августа 2018

если ваша СУБД поддерживает оконную функцию ROW_NUMBER, вы можете попытаться сделать номер строки по порядку GIFT_ID по SUM(GIFT_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

Примечание

Вы уже используете GROUP BY ключевое слово 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 |
...