Выберите несколько максимальных значений после запроса GROUP BY - PullRequest
0 голосов
/ 18 октября 2018

Предположим, у меня есть таблица, похожая на эту:

   date ID  income
0   9/1 C   10.40
1   9/3 A   33.90
2   9/3 B   29.10
3   9/4 C   19.30
4   9/4 B   17.80
5   9/5 B   9.55
6   9/5 C   11.10
7   9/5 A   13.10
8   9/7 A   29.10
9   9/7 B   29.10

Я хочу узнать идентификатор, который получил наибольшую прибыль за каждую дату.Наиболее интуитивным подходом было бы написать

SELECT ID, MAX(income) FROM table GROUP BY date

Но есть два идентификатора, которые сделали одинаковый MAX доход на 9/7, я хочу сохранить все связив тот же день, используя этот запрос, я проигнорирую один идентификатор на 9/7, а 29.1 появится на 9/3 и 9/7, любой другой подход?

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Попробуйте ниже, используя подзапрос и, поскольку вы связываете на одну дату, так что берите минимальный идентификатор, который даст вам один идентификатор с даты 9/7

select date,min(ID),income
from
(SELECT t1.date, t1.ID,t1.income
FROM tablename t1
INNER JOIN
(
    SELECT date, MAX(income) AS mincome
    FROM yourTable
    GROUP BY date
) t2 ON t1.date = t2.date AND t1.income = t2.mincome
)X group by date,income
0 голосов
/ 18 октября 2018

один подход может быть таким, как показано ниже

 with cte1
     (
    Select t1.*
    FROM yourTable t1
    INNER JOIN
    (
        SELECT date, MAX(income) AS max_income
        FROM yourTable
        GROUP BY date
    ) t2
        ON t1.date = t2.date AND t1.income = t2.max_income

     ) select min(ID) as ID, date,income from cte1 
      group by date,income

Поскольку вы не упомянули, какой идентификатор вам нужен в случае двух идентификаторов (если доход на определенную дату одинаков), поэтому я выбрал минимальный идентификатор среди них, когда двадоход id на тот же день одинаков, но в то же время вы можете использовать функцию max () также

0 голосов
/ 18 октября 2018

Подход, основанный на объединении, не имеет этой проблемы и сохранит все записи, привязанные к максимальному доходу на данную дату.

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT date, MAX(income) AS max_income
    FROM yourTable
    GROUP BY date
) t2
    ON t1.date = t2.date AND t1.income = t2.max_income
ORDER BY
    t1.date;

Способ работы вышеуказанного запроса состоит в том, чтобы объединить полный оригиналтаблица подзапроса, которая находит для каждой даты максимальное значение дохода.Это приводит к фильтрации любой записи, которая не имела максимального дохода на данную дату.Обратите особое внимание на условие соединения, которое состоит из двух компонентов: даты и дохода.

Если ваша база данных поддерживает аналитическую функцию, мы также можем использовать RANK здесь:

SELECT date, ID, income
FROM
(
    SELECT t.*, RANK() OVER (PARTITION BY date ORDER BY income DESC) rnk
    FROM yourTable t
) t
WHERE rnk = 1
ORDER BY date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...