如何计算此sql查询中唯一ID返回的行?

时间:2020-04-29 17:58:33

标签: sql postgresql join group-by count

此查询返回我将定义为“召回”的所有行。有关结果,请参见屏幕截图。我已经尝试过了,但到目前为止还没有弄清楚如何将每个ID的行数相加(每个调用都不同)。在下面的结果屏幕快照中,仅显示一个ID:61401。但是实际结果中还有其他ID较低。我想计算每个唯一ID的行数(调用次数)。我一直遇到汇总错误。我尝试了子查询和“分组依据”,但无法弄清楚。有什么想法可以做到吗?最终,我需要两列:id和callback_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

我想看到如下结果(其中callbacks_count只是每个ID返回的行数):

enter image description here

我还在这里尝试了Tan的建议,并获得了总计DB 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;

此外,我能够计算查询中的总行数,但仍然无法为每个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 个答案:

答案 0 :(得分:1)

您似乎只想聚合:

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;

答案 1 :(得分:0)

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

此代码根据ID进行分组,然后计算具有该特定ID的记录数。在使用所有列进行分组的代码中,每个组由每个召回条目组成,而不是由具有相同ID的一组召回条目组成。

edit:您似乎收到了汇总错误,因为您不能选择其他列而不将其分组(或对它们使用汇总函数)。请参阅:Aggregate function error while using group by clause in SQL

答案 2 :(得分:0)

我想出了答案。但是,我不需要显示“试用结束日期”列,但需要该列来标识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