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查找表的列名。找到所有列后,编写一个函数,为每个列创建查询并合并它。这样,您确实需要担心列的数量。