GROUP BY одно поле, оставляя другие поля - PullRequest
0 голосов
/ 10 декабря 2018

Базовая таблица bod с тремя полями:

| BOFORM_ID | FEINBOD | MAECHTBOD | 
+-----------+---------+-----------+
|   3301211 | fSms    |        50 |
|   3301211 | mSfs    |       150 |
|   3301231 | fSms    |       200 |
|   3301312 | Ss      |       150 |
|   3301312 | Su2     |        50 |

Я бы хотел

  1. Группировать по BOFORM_ID

  2. получить максимальное значение из MAECHTBOD

  3. , сохраняя связанный FEINBOD из той же строки, что и максимальное значение MAECHTBOD.

Я не знаю, как реализовать шаг 3.

Мой желаемый результат:

| BOFORM_ID | FEINBOD | MAECHTBOD | 
+-----------+---------+-----------+
|   3301211 | mSfs    |       150 |
|   3301231 | fSms    |       200 |
|   3301312 | Ss      |       150 |

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

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

SELECT t.BOFORM_ID, t.FEINBOD, t.MAECHTBOD 
FROM myTable t
INNER JOIN (
   SELECT sub_t.BOFORM_ID, MAX(sub_t.MAECHTBOD) AS MAX_BOD
   FROM myTable sub_t
   GROUP BY sub_t.BOFORM_ID
) AS agg
ON t.BOFORM_ID = agg.BOFORM_ID AND t.MAECHTBOD = agg.MAX_BOD
0 голосов
/ 10 декабря 2018

Вы можете использовать коррелированный подзапрос:

SELECT b.*
FROM bod as b
WHERE MAECHTBOD = (SELECT MAX(b1.MAECHTBOD) FROM bod as b1 WHERE b1.BOFORM_ID = b.BOFORM_ID);
...