Sql 聚合表的选择字段
使用Sql 聚合表的选择字段,sql,postgresql,Sql,Postgresql,使用表1如下所示 +-------------------------+--------+--------+--------+----------+---------+---------+ | time | regno | radar | speed | heading | people | lights | +-------------------------+--------+--------+--------+----------+----
表1
如下所示
+-------------------------+--------+--------+--------+----------+---------+---------+
| time | regno | radar | speed | heading | people | lights |
+-------------------------+--------+--------+--------+----------+---------+---------+
| 2017/03/28 06:00:06.112 | 11 | 1100 | 50 | down | 4 | false |
| 2017/03/28 06:00:06.112 | 12 | 1111 | 40 | up | 1 | false |
| 2017/03/28 06:00:06.113 | 11 | 1100 | 50 | down | 4 | false |
| 2017/03/28 06:00:07.100 | 21 | 1100 | 60 | down | 4 | false |
+-------------------------+--------+--------+--------+----------+---------+---------+
我需要生成一个输出表,其中从table1
中捕获select字段的聚合值,如下所示
+-----------+-------+------+------+---------+
| attribute | avg | min | max | median |
+-----------+-------+------+------+---------+
| speed | 50 | 40 | 60 | 40 |
| people | 3.25 | 1 | 4 | 4 |
+-----------+-------+------+------+---------+
我可以在临时表中单独聚合每个属性,然后对临时表进行并集以获得上述输出,但如果有大量属性(在我的例子中大约有20个),则会变得很麻烦-有没有更聪明的方法来实现这一点?您可以通过并集查询来实现,试试这个
SELECT avg(speed),min(speed),max(speed),'speed' as speed FROM `table1`
UNION
SELECT avg(people),min(people),max(people),'people' as people FROM `table1`
这与@dev8080给出的答案几乎相同,并且它也省略了中间值。您可以编写一个函数。您可以使用信息_SCHEMA.COLUMNS table查找表的列名。找到所有列后,编写一个函数,为每个列创建查询并合并它。这样,您确实需要担心列的数量。