SQL Подсчет и выбор других полей - PullRequest
0 голосов
/ 05 февраля 2020

Я знаю основы c, но я запутался. Я просто хочу добавить столбец в конце, который показывает количество уникальных_ключей

select unique_key , date_trunc('month',enrollment_date::date) date_enrolled,
enrollment_reason, count(unique_key)
from table1
group by unique_key;

Я получаю эту ошибку:

SQL compilation error: error line 1 at position 42 'unique_key' in select clause is neither an aggregate nor in the group by clause.

Ответы [ 3 ]

1 голос
/ 05 февраля 2020

Когда я запускаю это, я получаю сообщение об ошибке ...'enrollment_date' in select clause is neither an aggregate... Странно, что это происходит с ключом unique_key.

Но я думаю, что происходит то, что вы пытаетесь указать дату и причину зачисления в своем списке, но вы не сгруппированы по ним. Ваш запрос пытается получить все строки для одного unique_key, но затем он не знает, какой enrollment_reason вернуть, например. Даже если каждая запись с указанным c unique_key имеет один и тот же enrollment_reason, оптимизатор запросов этого не знает, поэтому он не делает этого предположения.

Как правило, чтобы исправить это, следует группировать по всему элементу select, который не является агрегатом.

select unique_key , date_trunc('month',enrollment_date::date) date_enrolled, 
enrollment_reason, count(unique_key)
from table1
group by unique_key, date_enrolled, enrollment_reason;

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

select unique_key,
  max(date_trunc('month',enrollment_date::date)) date_enrolled, 
  max(enrollment_reason),
  count(unique_key)
from table1
group by unique_key, date_enrolled, enrollment_reason;
0 голосов
/ 05 февраля 2020

Вы можете использовать производную таблицу для достижения этой цели. вам нужно иметь агрегатные функции для предложения GROUP BY.

select unique_key, count(date_enrolled)
from
(select unique_key , date_trunc('month',enrollment_date::date) date_enrolled,
enrollment_reason
from table1) as t
group by unique_key;
0 голосов
/ 05 февраля 2020

Я думаю, что вы намереваетесь:

select date_trunc('month',enrollment_date::date) as date_enrolled,
       enrollment_reason, count(*)
from table1
group by date_trunc('month',enrollment_date::date), enrollment_reason;
...