PostgreSQL在每个查询中合并两个查询,其中COUNT和GROUP BY

daf*_*ftu 1 postgresql join group-by crosstab

第一查询:

SELECT date_trunc('day', date1) as date, COUNT(*) AS count_a 
FROM table_a GROUP BY date
Run Code Online (Sandbox Code Playgroud)

结果:

date                    count_a
2014-04-01 00:00:00.0   1011642
2014-04-02 00:00:00.0   309048
Run Code Online (Sandbox Code Playgroud)

第二个查询:

SELECT date_trunc('day', date1) as date, COUNT(*) AS count_b 
FROM table_b GROUP BY date
Run Code Online (Sandbox Code Playgroud)

结果:

date                    count_b
2014-04-01 00:00:00.0   2342
2014-04-02 00:00:00.0   43432
Run Code Online (Sandbox Code Playgroud)

我想得到:

date                    count_a  count_b
2014-04-01 00:00:00.0   1011642  2342
2014-04-02 00:00:00.0   309048   43432
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Joa*_*son 5

一个简单的UNION ALL应该可以实现。

SELECT date1 date, SUM(a) count_a, SUM(b) count_b 
FROM (
  SELECT DATE_TRUNC('day', date1) date1, 1 a, 0 b FROM table_a 
  UNION ALL 
  SELECT DATE_TRUNC('day', date1) date1, 0 a, 1 b FROM table_b
) z 
GROUP BY date;
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个SQLfiddle


Erw*_*ter 5

用途FULL [OUTER] JOIN:

SELECT *
FROM  (
   SELECT date1::date AS day, COUNT(*) AS count_a
   FROM   table_a
   GROUP  BY 1
   ) a
FULL JOIN (
   SELECT date1::date AS day, COUNT(*) AS count_b
   FROM   table_b
   GROUP  BY 1
   ) b USING (day);
Run Code Online (Sandbox Code Playgroud)
  • USING子句自动折叠到结果中的day.
  • 获取日期只是投射到date.更快,更简单.

SQLfiddle(基于Joachim的).

次要差异:此查询返回NULL一天没有任何行的天数.使用COALESCE(count_b, 0)得到0代替.