Sql 在Postgres中,我如何组合两个分组查询并对结果进行简单划分?
如果我可以从表格栏执行此查询:Sql 在Postgres中,我如何组合两个分组查询并对结果进行简单划分?,sql,postgresql,group-by,Sql,Postgresql,Group By,如果我可以从表格栏执行此查询: SELECT count(distinct bar_id) as count, date_trunc('day', created_at) as date FROM bars GROUP BY date ORDER BY date desc 表foos中的查询: SELECT count(distinct foo_id), date_trunc('day', created_at) as date FROM
SELECT count(distinct bar_id) as count,
date_trunc('day', created_at) as date
FROM
bars
GROUP BY
date
ORDER BY
date desc
表foos中的查询:
SELECT count(distinct foo_id),
date_trunc('day', created_at) as date
FROM
foos
GROUP BY
date
ORDER BY
date desc
我得到了很好的列表,比如:
22, 2017-09-14
31, 2017-09-13
18, 2017-09-12
这是:
34, 2017-09-14
55, 2017-09-13
67, 2017-09-12
在一个查询中,如何结合这两个查询生成:
22/34, 0.64, 2017-09-14
31/55, 0.56, 2017-09-13
18/67, 0.26, 2017-09-12
i、 e.我想将表1中按天分组的每个计数除以表2中按天分组的每个计数。22/34=0.64、31/55=0.56等。您可以加入他们:
SELECT bars.counts * 1.0 / foos.counts
, bars.date
FROM
(
SELECT count(distinct bar_id) as counts,
date_trunc('day', created_at) as date
FROM
bars
GROUP BY
date
) bars_q
JOIN
(
SELECT count(distinct foo_id) as counts,
date_trunc('day', created_at) as date
FROM
foos
GROUP BY
date
) foos_q
ON bars_q.date = foos_q.date
你可以加入他们:
SELECT bars.counts * 1.0 / foos.counts
, bars.date
FROM
(
SELECT count(distinct bar_id) as counts,
date_trunc('day', created_at) as date
FROM
bars
GROUP BY
date
) bars_q
JOIN
(
SELECT count(distinct foo_id) as counts,
date_trunc('day', created_at) as date
FROM
foos
GROUP BY
date
) foos_q
ON bars_q.date = foos_q.date
您可以使用完全外部联接来检索两个表上的记录,还可以显示没有匹配日期的记录
SELECT CONCAT(COUNT(DISTINCT bar_id),'/',COUNT(distinct foo_id)) cnt,
CAST(COUNT(DISTINCT bar_id) AS FLOAT)/CASE WHEN COUNT(distinct foo_id) = 0
THEN 1
ELSE CAST(COUNT(distinct foo_id) AS FLOAT)
END "div",
CASE WHEN DATE_TRUNC('day', b.created_at) IS NULL
THEN DATE_TRUNC('day', f.created_at)
ELSE DATE_TRUNC('day', b.created_at)
END "date"
FROM bars b
FULL OUTER JOIN foos f
ON date_trunc('day', b.created_at) = date_trunc('day', f.created_at)
GROUP BY "date"
ORDER BY "date" DESC
您可以使用完全外部联接来检索两个表上的记录,还可以显示没有匹配日期的记录
SELECT CONCAT(COUNT(DISTINCT bar_id),'/',COUNT(distinct foo_id)) cnt,
CAST(COUNT(DISTINCT bar_id) AS FLOAT)/CASE WHEN COUNT(distinct foo_id) = 0
THEN 1
ELSE CAST(COUNT(distinct foo_id) AS FLOAT)
END "div",
CASE WHEN DATE_TRUNC('day', b.created_at) IS NULL
THEN DATE_TRUNC('day', f.created_at)
ELSE DATE_TRUNC('day', b.created_at)
END "date"
FROM bars b
FULL OUTER JOIN foos f
ON date_trunc('day', b.created_at) = date_trunc('day', f.created_at)
GROUP BY "date"
ORDER BY "date" DESC
简单地
join
两个按日期连接,然后运行除法。简单地join
两个按日期连接,然后运行除法。