Как я могу GROUP BY в сочетании с JOIN? - PullRequest
2 голосов
/ 25 мая 2019

Я пытаюсь взять значения из столбца в одной таблице и объединить их с максимальным значением для нескольких столбцов в другой таблице, где значение первой таблицы несколько раз отображается как внешний ключ.Мне также нужно ограничить число вхождений до 1 в том, что возвращает SELECT.

Мои (упрощенные) таблицы выглядят примерно так:

Names:
+--+------+
|PK|  name|
+--+------+
| 1|  Fred|
| 2|   Bob|
| 3|George|
+--+------+
Values:
+--+----+----+----+--+
|PK|val1|val2|val3|FK|
+--+----+----+----+--+
| 1|   1|   2|   5| 2|
| 2|   2|   0|   2| 1|
| 3|   1|   1|NULL| 1|
| 4|   7|   0|NULL| 2|
| 5|   0|   3|   3| 3|
| 6|   5|   2|   2| 3|
| 7|   6|   3|   0| 1|
| 8|   1|   2|   5| 3|
| 9|   0|   2|NULL| 2|
+--+----+----+----+--+

Мой текущий запрос:

SELECT Name.name, GREATEST(Vals.val1, COALESCE(val2, 0), COALESCE(val3, 0))
    FROM Name INNER JOIN (Vals) ON Name.PK = Vals.FK;

Цель состоит в том, чтобы получить максимальное значение, которое когда-либо встречается для каждого имени.Результат должен выглядеть примерно так: Макс:

+------+---+
|  name|max|
+------+---+
|  Fred|  6|
|   Bob|  7|
|George|  5|
+------+---+

Но сейчас я вижу следующее:

+------+---+
|  name|max|
+------+---+
|  Fred|  2|
|  Fred|  1|
|  Fred|  6|
|   Bob|  5|
|   Bob|  7|
|   Bob|  2|
|George|  3|
|George|  5|
|George|  5|
+------+---+

Где я получаю среднее значение для каждого вхождения ключа имени,Я не уверен, нужно ли мне «WHERE» или «GROUP BY», чтобы решить эту проблему, но каждый раз, когда я пытался либо, я получаю ошибки.Например:

SELECT Name.name, GREATEST(Vals.val1, COALESCE(val2, 0), COALESCE(val3, 0))
    FROM Name INNER JOIN (Vals) ON Name.PK = Vals.FK GROUP BY Name.name;

SELECT Name.name, GREATEST(Vals.val1, COALESCE(val2, 0), COALESCE(val3, 0)) WHERE Vals.FK = Name.PK
    FROM Name INNER JOIN (Vals) ON Name.PK = Vals.FK;

1 Ответ

0 голосов
/ 25 мая 2019

Сокращение нескольких строк в одно значение для группы достигается с помощью агрегатных функций, например, MAX

SELECT Name.name,
       MAX(GREATEST(Vals.val1, COALESCE(val2, 0), COALESCE(val3, 0))) max
  FROM Name
  INNER JOIN (Vals) ON Name.PK = Vals.FK
  GROUP BY Name.name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...