2010-10-20 14 views
0

J'ai ces données postgresqlpostgresql union

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 

Comment puis-je obtenir?

(ROUND(AVG(rate),1) AS avg_rate, hrv WHERE rate <> -1) UNION (ROUND(AVG(activity),1) AS avg_activity, hrv WHERE activity <> -1) 

en résultat d'une seule ligne? Veuillez noter que 'hrv' est la colonne courante AVG (hrv) dans le résultat final.

avg_rate | avg_activity | AVG(hrv) | 
83.1  | 71.2   | 0  | 

Répondre

1
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; 
+0

vous avez manqué la condition WHERE. C'est différent pour chaque requête. AVG (taux) a un ensemble de lignes, AVG (activité) a d'autres Ils ne sont pas le même ensemble. J'aurais très bien fait une requête droite sinon. – ramonrails

+0

@ramonrails - Désolé pour cela, vérifiez ma réponse éditée. – dcp

+0

En plus de cela, je veux que ces colonnes apparaissent dans une rangée mais comme 2 colonnes. – ramonrails

0

Si je comprends ce que vous voulez bien, cela devrait le faire:

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 
+0

Comment puis-je obtenir avg (taux), avg (activité), avg (hrv) où les trois ensembles de résultats sont différents à partir desquels ils dérivent des moyennes? – ramonrails

+0

Les instructions 'case' vous permettent de prendre des moyennes sur différentes parties, en comptant les lignes que vous ne voulez pas prendre en compte comme nulles, ce qui ne tient pas compte de la moyenne. Ici, avg_rate est la valeur moyenne sur toutes les lignes de la table où le taux n'est pas -1, par exemple. –

+0

Oui, je connais l'instruction CASE. Je demandais quelque chose de différent cependant. Peu importe, je l'ai compris maintenant. Merci Rudd, d'avoir sonné :) – ramonrails