выберите * группу по отдельным столбцам - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть данные таблицы следующим образом: Id c1 c2 8802 1 1 8802 3 1 8802 3 2 8802 4 1

Как мне написать запрос для извлечения всех столбцов, но иметь уникальный (id, c1). Неважно, какое значение в с2 равно

Мой окончательный вывод будет выглядеть так

Id c1 c2 2202 1 1 2202 3 (1 or 2 does not matter) 2202 4 1

У меня есть 10+ столбцов в таблице, и все столбцы должны быть отображены. Чтобы использовать предложение group by, мне нужно предоставить предложение select с этими конкретными именами столбцов, и я не получаю желаемый вывод

select Id, c1 from table group by (Id, c1) выдаст список всего Id,c1.

Как получить все столбцы?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Поскольку вы используете группу по, вы можете использовать агрегацию с ней. Вам может быть все равно, какое значение C2 возвращается; но Система должна знать, какой вы хотите.

Итак:

SELECT ID, C1, max(C2) 
FROM table 
GROUP BY ID, C1

ИЛИ используйте оконную функцию, такую ​​как LISTAGG, чтобы объединить все значения в список через запятую

SELECT ID, C1, LISTAGG(C2, ', ') WITHIN GROUP (ORDER BY C2)` 
FROM table
GROUP BY ID, C1 

Или используйте CTE и оконную функцию для назначения номера строки и ограничения только для 1-й записи каждой группировки. Учитывая другие столбцы и предполагаемое стремление к связанным значениям с тем же значением C2; это кажется лучшим подходом.

WITH CTE AS (
SELECT A.*, Row_number() over (partition by ID, C1 ORDER BY C2) RN
FROM table A)
SELEC *
FROM CTE
WHERE RN = 1
0 голосов
/ 07 ноября 2018

Вы можете использовать функцию агрегирования:

select id, c1, min(c2) as c2
from t
group by id, c1;

Вы хотите одну строку для каждого отдельного значения id / c1. Следовательно, они должны быть в group by. Если вам нужны другие столбцы, они должны быть аргументами для функций агрегирования.

Вы можете использовать оконные функции для получения группы столбцов:

select t.*
from (select t.*, row_number() over (partition by id, c1 order by id) as seqnum
      from t
     ) t
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...