Postgresql在多列上使用count

时间:2016-01-04 21:10:54

标签: postgresql

我有两张桌子。第一个生成计算第二个记录的条件。这两个表通过时间戳以1:1的关系链接 问题是第二个表有很多列,我们需要为每个列匹配第一列中的条件。

例:
符合

CREATE TABLE met (
    tstamp timestamp without time zone NOT NULL,
    h1_rad double precision,
    CONSTRAINT met_pkey PRIMARY KEY (tstamp)
)

CREATE TABLE pot (
    tstamp timestamp without time zone NOT NULL,
    c1 double precision,
    c2 double precision,
    c3 double precision,
    CONSTRAINT met_pkey PRIMARY KEY (tstamp)
)

从c1到c108真正有108列

表值:

+   Table met             +  +    Table pot                        +
+----------------+--------+--+----------------+------+------+------+
|     tstamp     | h1_rad |  |     tstamp     |  c1  |  c2  |  c3  |
+----------------+--------+--+----------------+------+------+------+
| 20150101 00:00 | 0      |  | 20150101 00:00 | 5,5  | 3,3  | 15,6 |
| 20150101 00:05 | 1,8    |  | 20150101 00:05 | 12,8 | 15,8 | 1,5  |
| 20150101 00:10 | 15,4   |  | 20150101 00:10 | 25,4 | 4,5  | 1,4  |
| 20150101 00:15 | 28,4   |  | 20150101 00:15 | 18,3 | 63,5 | 12,5 |
| 20150101 00:20 | 29,4   |  | 20150101 00:20 | 24,5 | 78   | 17,5 |
| 20150101 00:25 | 13,5   |  | 20150101 00:25 | 12,8 | 5,4  | 18,4 |
| 20150102 00:00 | 19,5   |  | 20150102 00:00 | 11,1 | 25,6 | 6,5  |
| 20150102 00:05 | 2,5    |  | 20150102 00:05 | 36,5 | 21,4 | 45,2 |
| 20150102 00:10 | 18,4   |  | 20150102 00:10 | 1,4  | 35,5 | 63,5 |
| 20150102 00:15 | 20,4   |  | 20150102 00:15 | 18,4 | 23,4 | 8,4  |
| 20150102 00:20 | 6,8    |  | 20150102 00:20 | 16,8 | 12,5 | 18,4 |
| 20150102 00:25 | 17,4   |  | 20150102 00:25 | 25,8 | 23,5 | 9,5  |
+----------------+--------+--+----------------+------+------+------+

我需要的是底池的行数,其中当遇到时,值大于15且具有相同时间戳的值高于15,按天分组

提供数据我们需要:

+----------+----+----+----+
|   day    | c1 | c2 | c3 |
+----------+----+----+----+
| 20150101 |  3 |  2 |  1 |
| 20150102 |  2 |  4 |  1 |
+----------+----+----+----+

我怎么能得到这个?
即使使用subquerys,这是否可以通过单个查询进行?

实际上,原始数据每隔一分钟存储在其他表中。表格符合底池是对表格进行汇总和过滤的表格 如果需要,我可以创建包含数天汇总数据的表格,如果这样可以简化解决方案。

由于

Pd积。 对不起我的英文

1 个答案:

答案 0 :(得分:0)

您可以使用一些CASE语句解决此问题。测试两个条件,如果为true,则返回1.然后使用SUM()上的GROUP BY将结果timestamp转换为日期以获得总数:

SELECT
    date(met.tstamp),
    SUM(CASE WHEN met.h1_rad > 15 AND pot.c1 > 15 THEN 1 END) as C1,
    SUM(CASE WHEN met.h1_rad > 15 AND pot.c2 > 15 THEN 1 END) as C2,
    SUM(CASE WHEN met.h1_rad > 15 AND pot.c3 > 15 THEN 1 END) as C3
FROM
    met INNER JOIN pot ON met.tstamp = pot.tstamp
GROUP BY date(met.tstamp)