2017-09-15 44 views
0

如果我能做到从表吧这个查询:在Postgres中,我怎样才能将两组查询结合起来并对结果进行简单的划分?

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 

即我要划分从表1的各计由表2天按天分组分组。 34分之22= 0.64,五十五分之三十一= 0.56等

+0

只需按日期“加入”,然后运行分部。 – Parfait

回答

2

您可以加入他们的行列:

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 
0

你可以使用全外连接检索两个表中的记录,也将显示与没有匹配的日期的记录

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