Группировать по столбцам и заполнять столбцы уникальной строкой ранжирования - PullRequest
0 голосов
/ 28 сентября 2018

Я основываю запрос на таблице, которая имеет, скажем, результаты событий.В каждом ряду есть команда, которая участвовала, и их итоговое место для этого события (макс. 4 команды участвуют).Я хочу выполнить запрос, основанный на этом, который сгруппирует по событию и создаст столбец для каждого места размещения и заполнит его командой, получившей этот ранг во время этого события.

Для этого я создал поля (first_place, second_place и т. д.), который проверяет условный оператор case по отношению к столбцу ранга, и если команда получит результат, соответствующий этому столбцу, она заполнит столбец именем этой команды.

Проблема, с которой я сталкиваюсь, заключается вчто если я не добавлю случаи в группу, в которой будут возникать ошибки (по крайней мере, в Oracle SQL Fiddle обрабатывает это, но результат все равно неверный).Если я добавлю их к предложению группы, он выведет по 1 строке для каждой команды и ранжирует с остальными столбцами NULL.

Это имеет смысл для такой группировки, но, похоже, не может найтиобходной путь.Я пытался использовать что-то вроде COALESCE, но ничего, что я не мог найти, работает как агрегатная функция.

SQL Fiddle и DDL ниже для вашей справки.Любая помощь приветствуется.

http://sqlfiddle.com/#!9/8ae4c9/1

Определение таблицы

CREATE TABLE Table1
    (`pk_id` int, `evt_id` int, `team` varchar(5), `rank` int)
;

INSERT INTO Table1
    (`pk_id`, `evt_id`, `team`, `rank`)
VALUES
    (1, 1, 'TeamA', 1),
    (2, 1, 'TeamB', 2),
    (3, 1, 'TeamC', 3),
    (4, 1, 'TeamD', 4),
    (5, 2, 'TeamD', 1),
    (6, 2, 'TeamB', 2),
    (7, 2, 'TeamC', 3),
    (8, 2, 'TeamA', 4),
    (9, 3, 'TeamB', 1),
    (10, 3, 'TeamD', 2),
    (11, 3, 'TeamC', 3),
    (12, 3, 'TeamA', 4),
    (13, 4, 'TeamD', 1),
    (14, 4, 'TeamC', 2),
    (15, 4, 'TeamA', 3),
    (16, 4, 'TeamB', 4)
;

Запрос

SELECT
  evt_id,
  CASE rank WHEN 1 THEN team END as first_place,
  CASE rank WHEN 2 THEN team END as second_place,
  CASE rank WHEN 3 THEN team END as third_place,
  CASE rank WHEN 4 THEN team END as fourth_place
FROM
  Table1
GROUP BY
  evt_id
;

Текущие результаты

+--------+-------------+--------------+-------------+--------------+
| evt_id | first_place | second_place | third_place | fourth_place |
+--------+-------------+--------------+-------------+--------------+
|      1 | TeamA       | (null)       | (null)      | (null)       |
|      1 | (null)      | TeamB        | (null)      | (null)       |
|      1 | (null)      | (null)       | TeamC       | (null)       |
|      1 | (null)      | (null)       | (null)      | TeamD        |
|      2 | TeamD       | (null)       | (null)      | (null)       |
|      2 | (null)      | TeamB        | (null)      | (null)       |
|      2 | (null)      | (null)       | TeamC       | (null)       |
|      2 | (null)      | (null)       | (null)      | TeamA        |
|      3 | TeamB       | (null)       | (null)      | (null)       |
|      3 | (null)      | TeamD        | (null)      | (null)       |
|      3 | (null)      | (null)       | TeamC       | (null)       |
|      3 | (null)      | (null)       | (null)      | TeamA        |
|      4 | TeamD       | (null)       | (null)      | (null)       |
|      4 | (null)      | TeamC        | (null)      | (null)       |
|      4 | (null)      | (null)       | TeamA       | (null)       |
|      4 | (null)      | (null)       | (null)      | TeamB        |
+--------+-------------+--------------+-------------+--------------+

Ожидаемый результат

+--------+-------------+--------------+-------------+--------------+
| evt_id | first_place | second_place | third_place | fourth_place |
+--------+-------------+--------------+-------------+--------------+
|      1 | TeamA       | TeamB        | TeamC       | TeamD        |
|      2 | TeamD       | TeamB        | TeamC       | TeamA        |
|      3 | TeamB       | TeamD        | TeamC       | TeamA        |
|      4 | TeamD       | TeamC        | TeamA       | TeamB        |
+--------+-------------+--------------+-------------+--------------+

1 Ответ

0 голосов
/ 28 сентября 2018

Я думаю, вы просто хотите использовать некоторые функции агрегирования:

SELECT evt_id,
       MAX(CASE rank WHEN 1 THEN team END) as first_place,
       MAX(CASE rank WHEN 2 THEN team END) as second_place,
       MAX(CASE rank WHEN 3 THEN team END) as third_place,
       MAX(CASE rank WHEN 4 THEN team END) as fourth_place
FROM Table1
GROUP BY evt_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...