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

Этот запрос возвращает все строки, которые я определю как «отзыв». Смотрите скриншот для результатов. Я пытался и до сих пор не смог выяснить, как суммировать количество строк (каждый отдельный отзыв) для каждого идентификатора. На скриншоте результатов ниже показан только один идентификатор: 61401. Но есть и другие идентификаторы ниже в фактических результатах. Я хотел бы посчитать количество строк (повторений) на уникальный идентификатор. Я продолжаю сталкиваться с совокупными ошибками. Я пробовал подзапросы и 'group by', но просто не могу понять это. Есть идеи, как я могу это сделать? В конечном итоге мне нужны два столбца: 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;

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

enter image description here

I ' Хотелось бы видеть результаты, которые выглядят так (где revs_count - просто число строк, возвращаемых на один идентификатор):

enter image description here

Я также попробовал предложение Тана здесь и получить совокупную БД Errorcode = 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
);

Выходными данными является общее количество:

enter image description here

@ 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;

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

enter image description here

`

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

Похоже, вы просто хотите агрегировать:

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;
0 голосов
/ 30 апреля 2020

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

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
0 голосов
/ 29 апреля 2020
Select prr_u.id as id, count(distinct recall_create_date) as recall_count... Group by prr_u.id 

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

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

...