postgresql联盟
我在postgresql中有这些数据postgresql联盟,sql,stored-procedures,postgresql,Sql,Stored Procedures,Postgresql,我在postgresql中有这些数据 id | rate | hrv | activity | orientation | timestamp | user_id | status ----------+-----------+-----+----------+-------------+------------------------+---------+-------------- 66764728 | 72 | 1 |
id | rate | hrv | activity | orientation | timestamp | user_id | status
----------+-----------+-----+----------+-------------+------------------------+---------+--------------
66764728 | 72 | 1 | 0 | 90 | 2010-06-10 18:54:54+00 | 397 | t
66764729 | 72 | 1 | 0 | 90 | 2010-06-10 18:55:09+00 | 397 | t
66764730 | 76 | 1 | 0 | 90 | 2010-06-10 18:55:23+00 | 397 | t
66766058 | 68 | 1 | 0 | 90 | 2010-06-10 18:55:38+00 | 397 | t
66766059 | 72 | 1 | 0 | 90 | 2010-06-10 18:55:53+00 | 397 | t
66766063 | 80 | 1 | 0 | 0 | 2010-06-10 18:56:51+00 | 397 | t
66766085 | 100 | 1 | 0 | 0 | 2010-06-10 18:57:06+00 | 397 | t
66766091 | -1 | -1 | 1558 | 90 | 2010-06-10 18:58:34+00 | 397 | t
66766118 | -1 | -1 | 2055 | 0 | 2010-06-10 18:58:49+00 | 397 | t
66766119 | -1 | -1 | 2869 | 90 | 2010-06-10 18:59:03+00 | 397 | t
66766121 | -1 | -1 | 3187 | 90 | 2010-06-10 18:59:18+00 | 397 | t
66766120 | -1 | -1 | 3302 | 0 | 2010-06-10 18:59:33+00 | 397 | t
66766122 | -1 | -1 | 2222 | 0 | 2010-06-10 18:59:47+00 | 397 | t
66766133 | 60 | 7 | 0 | 0 | 2010-06-10 19:00:16+00 | 397 | t
66766134 | 64 | 1 | 0 | 0 | 2010-06-10 19:00:31+00 | 397 | t
66766135 | 72 | 1 | 0 | 0 | 2010-06-10 19:00:46+00 | 397 | t
66766137 | 72 | 0 | 0 | 0 | 2010-06-10 19:01:15+00 | 397 | t
66766155 | 132 | 1 | 0 | 0 | 2010-06-10 19:01:59+00 | 397 | t
66766159 | -1 | -1 | 1858 | 90 | 2010-06-10 19:02:58+00 | 397 | t
我该怎么去
( ROUND(AVG(rate),1) AS avg_rate, hrv WHERE rate <> -1 ) UNION ( ROUND(AVG(activity),1) AS avg_activity, hrv WHERE activity <> -1 )
如果我正确理解您的需求,这应该可以做到:
select round(avg(case
when rate <> -1 then rate
else null
end), 1) as avg_rate
, round(avg(case
when activity <> -1 then activity
else null
end), 1) as avg_activity
, round(avg(hrv)) as avg_hrv
from my_table
你错过了WHERE条件。每个查询都不同。AVGrate有一组行,AVGactivity有其他行。它们不是同一组。否则,我会很好地进行直接查询。除此之外,我希望这些列显示在一行中,但显示为两列。@Ramonrails-我相信我所做的应该没有经过测试,因此可能有一些语法错误,但希望没有:。这对我来说很有效。但是我的SQL更大。这是我问的一个非常简化的版本谢谢。这称为内联视图,以备将来参考。如何获取avgrate、avgactivity和avghrv,其中所有三个结果集都不同于它们导出平均值的结果集?case语句允许您通过将不希望考虑的行计数为null,对不同部分进行平均值计算,这并没有计入平均值。这里,avg_rate是表中所有行的平均值,例如,其中rate不是-1。是的,我知道CASE语句。不过我问了一些不同的问题。没关系,我现在明白了。谢谢陆克文插话:哦,当然。对不起,我帮不上忙了!
SELECT a.avg_rate
, b.avg_activty
FROM
(SELECT ROUND(AVG(rate),1) AS avg_rate
WHERE rate <> -1) a,
(SELECT ROUND(AVG(activity),1) AS avg_activity
WHERE activity <> -1) b;
select round(avg(case
when rate <> -1 then rate
else null
end), 1) as avg_rate
, round(avg(case
when activity <> -1 then activity
else null
end), 1) as avg_activity
, round(avg(hrv)) as avg_hrv
from my_table