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
两个按日期连接,然后运行除法。