此查询返回我将定义为“召回”的所有行。有关结果,请参见屏幕截图。我已经尝试过了,但到目前为止还没有弄清楚如何将每个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;
以下是结果的摘要:
我想看到如下结果(其中callbacks_count只是每个ID返回的行数):
我还在这里尝试了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
);
输出是以下各项的总数:
@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;
会产生以下汇总错误:
`
答案 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