Как подсчитать строки, возвращаемые для уникального идентификатора в этом запросе sql?

Этот запрос возвращает все строки, которые я определяю как «отзывы». Смотрите скриншот для результатов. Я пытался и до сих пор не смог понять, как суммировать количество строк (каждая из которых является отдельным отзывом) для каждого идентификатора. На скриншоте результатов ниже показан только один идентификатор: 61401. Но в фактических результатах есть и другие идентификаторы ниже. Я хотел бы подсчитать количество строк (отзывов) на уникальный идентификатор. Я продолжаю сталкиваться с совокупными ошибками. Я пробовал подзапросы и «группировать по», но просто не могу понять. Любые идеи, как я могу это сделать? В конечном итоге мне нужны два столбца: id и Rec_Count.

SELECT 
prr_u.id, 
cprr_r.created_at AS recall_create_date, 
prr_m.created_at AS trial_start_date, 
prr_m.trial_days AS trial_period_length, 
prr_m.created_at + interval '1 day' * trial_period_length AS trial_end_date
FROM my_db.productionrr_users AS prr_u
INNER JOIN my_db.productionrr_memberships AS prr_m
ON prr_u.id = prr_m.id
INNER JOIN my_db.c4productionrr_recalls AS cprr_r
ON cprr_r.user_id = prr_m.id
WHERE recall_create_date BETWEEN trial_start_date AND trial_end_date;

Вот фрагмент результата:

введите здесь описание изображения

Я хотел бы увидеть результаты, которые выглядят следующим образом (где Recots_count — это просто количество строк, возвращаемых для каждого идентификатора):

введите здесь описание изображения

Я также попробовал предложение Тана здесь и получил совокупный код ошибки БД = 500310.

SELECT
prr_u.id as id,
cprr_r.created_at AS recall_create_date, 
prr_m.created_at AS trial_start_date, 
prr_m.trial_days AS trial_period_length, 
prr_m.created_at + interval '1 day' * trial_period_length AS trial_end_date,
COUNT(DISTINCT recall_create_date) as recall_count 
FROM my_db.productionrr_users AS prr_u
INNER JOIN my_db.productionrr_memberships AS prr_m
ON prr_u.id = prr_m.id
INNER JOIN my_db.c4productionrr_recalls AS cprr_r
ON cprr_r.user_id = prr_m.id
WHERE recall_create_date BETWEEN trial_start_date AND trial_end_date
GROUP BY prr_u.id;

Кроме того, я могу подсчитать общее количество строк в запросе, но я все еще не могу сделать это для каждого идентификатора:

SELECT COUNT(*) FROM (
SELECT prr_u.id, prr_u.email, prr_m.status, cprr_r.created_at AS recall_create_date, prr_m.created_at AS trial_start_date, prr_m.trial_days AS trial_period_length, prr_m.created_at + interval '1 day' * trial_period_length AS trial_end_date, prr_m.expires_at
FROM my_db.productionrr_users AS prr_u
INNER JOIN my_db.productionrr_memberships AS prr_m
ON prr_u.id = prr_m.id
INNER JOIN my_db.c4productionrr_recalls AS cprr_r
ON cprr_r.user_id = prr_m.id
WHERE recall_create_date BETWEEN trial_start_date AND trial_end_date
);

Выход - это общее количество:

введите здесь описание изображения

@gmb Я не могу обойти эту ошибку агрегатной функции. Я пробовал это, так как не могу запустить ваш код как есть:

SELECT prr_u.id,
prr_m.created_at + interval '1 day' * prr_m.trial_days AS trial_end_date,
COUNT(*) AS recalls_count
FROM my_db.productionrr_users AS prr_u
INNER JOIN my_db.productionrr_memberships AS prr_m 
ON prr_u.id = prr_m.id
INNER JOIN my_db.c4productionrr_recalls AS cprr_r 
ON cprr_r.user_id = prr_m.id
WHERE cprr_r.created_at BETWEEN prr_m.created_at AND trial_end_date
GROUP BY prr_u.id;

что приводит к следующей совокупной ошибке:

введите здесь описание изображения

`


person Kierk    schedule 29.04.2020    source источник
comment
Пожалуйста, покажите нам результат, который вы ожидаете.   -  person GMB    schedule 29.04.2020
comment
Пожалуйста, используйте текст, а не изображения/ссылки, для текста, включая таблицы и ERD. Используйте изображения только для того, что не может быть выражено в виде текста или для дополнения текста. Включите легенду / ключ и объяснение с изображением.   -  person philipxy    schedule 30.04.2020
comment
Пожалуйста, в вопросах кода дайте минимальный воспроизводимый пример - вырезайте, вставляйте и запускайте код, включая наименьший репрезентативный ввод примера как код; желаемый и фактический вывод (включая дословные сообщения об ошибках); теги и версии; четкая спецификация и объяснение. Дайте наименьший код, который вы можете дать, это код, который, как вы показываете, в порядке, расширенный кодом, который, как вы показываете, не в порядке. (Основы отладки.) Для SQL, который включает СУБД и DDL (включая ограничения и индексы) и ввод в виде кода, отформатированного в виде таблицы. Как спросить Перестаньте пытаться закодировать свою общую цель и для 1 проблемного запроса скажите, что вы ожидали вместо данного кода & Зачем.   -  person philipxy    schedule 30.04.2020
comment
Я пытался добавить результаты в текст, но это было слишком грязно.   -  person Kierk    schedule 30.04.2020
comment
Просто сделай это. Используйте формат блока кода. (Прочитайте справку по редактированию.) PS И код, и данные здесь могут быть намного меньше для каждого проблемного запроса. (Публикуйте 1 вопрос на 1 запрос.) PS Скорее всего, ваш вопрос просто дублирует основы группировки и агрегации, и вам даже не нужно публиковать. Прежде чем рассматривать публикацию, прочитайте руководство и погуглите любое сообщение об ошибке или множество четких, кратких и точных формулировок вашего вопроса/проблемы/цели, с вашими конкретными строками/именами и без них, а также с тегами site:stackoverflow.com и; прочитал много ответов. Отразите свое исследование. См. раздел Как задать вопрос и тексты при наведении указателя мыши на стрелку голосования.   -  person philipxy    schedule 30.04.2020
comment
Я новичок в sql. Поэтому я хотел включить все элементы запроса, так как не был уверен, что Join влияет на GROUP BY каким-то образом, которого я не понимаю. Хотя ваш комментарий имеет силу, он не соответствует моему уровню понимания SQL. Поэтому я не хотел его разбирать. Также я совершенно не мог найти ответ. Это потому, что я выбирал столбец с уникальными значениями, что меня сбивало с толку. Длинная история. Но я поддерживаю свою потребность включить запрос как есть, не убирая его. Я не мог бы понять это без некоторых указаний, которые я получил здесь в контексте моего сообщения и запроса.   -  person Kierk    schedule 01.05.2020


Ответы (3)


Похоже, вам просто нужна агрегация:

SELECT prr_u.id, COUNT(*) recalls_count
FROM my_db.productionrr_users AS prr_u
INNER JOIN my_db.productionrr_memberships AS prr_m ON prr_u.id = prr_m.id
INNER JOIN my_db.c4productionrr_recalls AS cprr_r ON cprr_r.user_id = prr_m.id
WHERE recall_create_date BETWEEN trial_start_date AND trial_end_date
GROUP BY ppr_u.id;
person GMB    schedule 29.04.2020
comment
Как мне вписать это, не получая совокупной ошибки? prr_m.created_at + interval '1 day' * trial_period_length AS trial_end_date - person Kierk; 29.04.2020
comment
@Kierk: этот столбец не относится к ожидаемому результату, который вы показали. - person GMB; 29.04.2020
comment
Этот столбец необходим для соединения и предложений where для получения желаемого результата. Но это не должно быть в выводе. - person Kierk; 29.04.2020
comment
@Kierk: в приведенном выше запросе используется то же предложение where и условия соединения, что и в исходном запросе. Это должно дать результаты, которые вы ожидаете. - person GMB; 29.04.2020
comment
Я добавил свою попытку, основанную на вашем предложении, к моему вопросу. - person Kierk; 30.04.2020

Select prr_u.id as id, count(distinct recall_create_date) as recall_count... Group by prr_u.id 

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

редактировать: вы, кажется, получаете агрегированную ошибку, потому что вы не можете выбрать дополнительные столбцы, не группируя их (или используя для них агрегатную функцию). См.: Ошибка функции агрегирования при использовании предложения group by в SQL .

person TAN TING XUAN KELLY _    schedule 29.04.2020
comment
Спасибо. Я добавил свою интерпретацию вашего предложения в свой пост. Это то, о чем вы думали? Это дает мне ошибку агрегатной функции: 500310. - person Kierk; 29.04.2020

Я понял ответ. Но мне не нужно показывать столбец с датой окончания пробного периода, но мне нужен этот столбец, чтобы определить end_date. Моя проблема все время заключалась в том, что я добавлял неуникальный столбец в свой выбор и группу, поэтому каждый «отзыв» учитывался один раз и не суммировался.

SELECT prr_u.id,
prr_m.created_at + interval '1 day' * prr_m.trial_days AS trial_end_date,
COUNT(*) AS recalls_count
FROM my_db.productionrr_users AS prr_u
INNER JOIN my_db.productionrr_memberships AS prr_m 
ON prr_u.id = prr_m.id
INNER JOIN my_db.c4productionrr_recalls AS cprr_r 
ON cprr_r.user_id = prr_m.id
WHERE cprr_r.created_at BETWEEN prr_m.created_at AND trial_end_date
GROUP BY prr_u.id, trial_end_date;
```
[![enter image description here][1]][1]


  [1]: https://i.stack.imgur.com/JmzWg.png
person Kierk    schedule 29.04.2020
comment
Пожалуйста, посмотрите отформатированную версию вашего поста перед публикацией. PS Используйте текст, а не ссылки/изображения для текста. - person philipxy; 30.04.2020