Добавьте к функциям max / min дополнительную информацию из связанных столбцов - PullRequest
0 голосов
/ 25 сентября 2019

Я использую 10.1.39-MariaDB - двоичный файл mariadb.org, и у меня есть следующая таблица:

| id  | product   | delivery_date       | issuer   | price_from | price_to | createdAt           | updatedAt           |
|-----|-----------|---------------------|----------|------------|----------|---------------------|---------------------|
| 452 | product 1 | 2019-09-17 22:00:00 | Issuer 1 | 247        | 247      | 2019-09-18 19:03:29 | 2019-09-18 19:03:29 |
| 454 | product 1 | 2019-09-14 22:00:00 | Issuer 2 | 245        | 245      | 2019-09-18 19:03:29 | 2019-09-18 19:03:29 |
| 455 | product 2 | 2019-09-12 22:00:00 | Issuer 3 | 150        | 150      | 2019-09-18 19:03:29 | 2019-09-18 19:03:29 |
| 456 | product 2 | 2019-09-12 22:00:00 | Issuer 4 | 187        | 165      | 2019-09-18 19:03:29 | 2019-09-18 19:03:29 |
| 457 | product 1 | 2019-09-11 22:00:00 | Issuer 5 | 247        | 247      | 2019-09-18 19:03:29 | 2019-09-18 19:03:29 |

Я кодировал следующий запрос:

SELECT
    EXTRACT(YEAR
FROM
    rating_date) AS 'Year',
    AVG(`price_from`) AS avg_1y_price_from,
    AVG(`price_to`) AS avg_1y_price_to,
    MAX(`price_from`) AS max_1y_price_from,
    MAX(`price_to`) AS max_1y_price_to,
    MIN(`price_from`) AS min_1y_price_from,
    MIN(`price_to`) AS min_1y_price_to
FROM
    table
GROUP BY
    YEAR(delivery_date)
ORDER BY
    `Year`
DESC

Однако яхотел бы показать для каждой агрегатной функции соответствующего эмитента, чтобы я получил для max_1y_price_from эмитента, который имеет максимальное значение.

Любые предложения, как добавить правильного эмитента?

Я ценюваши ответы!

1 Ответ

1 голос
/ 25 сентября 2019

Вы можете использовать join:

SELECT y.*, tmaxpfrom.issuer, tmaxpto.issuer, . . . 
FROM (SELECT EXTRACT(YEAR FROM rating_date) AS Year,
             AVG(`price_from`) AS avg_1y_price_from,
             AVG(`price_to`) AS avg_1y_price_to,
             MAX(`price_from`) AS max_1y_price_from,
             MAX(`price_to`) AS max_1y_price_to,
             MIN(`price_from`) AS min_1y_price_from,
             MIN(`price_to`) AS min_1y_price_to
      FROM t
      GROUP BY YEAR(delivery_date)
     ) y LEFT JOIN
     t tmaxpfrom
     ON YEAR(tmaxpfrom.delivery_date) = y.year AND
        tmaxpfrom.price_to = max_1y_price_from LEFT JOIN
     t tmaxpto
     ON YEAR(tmaxpto.delivery_date) = y.year AND
        tmaxpto.price_to = max_1y_price_to LEFT JOIN
     . . . 
ORDER BY `Year` DESC

Просто продолжите для всех столбцов, где вы хотите список.

Примечание: Если есть дубликаты, будет возвращено несколько строк длягод.

Кроме того, это будет проще в более поздней версии MariaDB, так что вы можете использовать оконные функции.

...