2017-08-16 1 views
1

J'essaie d'extraire de l'une de nos tables db la fréquence d'un type particulier d'étude qui correspond au type «G» (G GAR GER GR) ainsi que le nombre total d'études dans cette semaine (correspond à tout type) et la fréquence relative des «G». Je veux que la sortie soit groupée en semaines (commençant le lundi et se terminant le vendredi).psql extraits comptes hebdomadaires et pourcentage du total

J'utilise generate_series pour obtenir une gamme de lundi au cours de la période d'intérêt

SELECT (current_date- cast(extract(dow from current_date) as int) + 1) - s.a AS dates FROM generate_series(0,182,7) AS s(a);

En utilisant la commande suivante

FROM (SELECT (current_date- cast(extract(dow from current_date) as int) + 1) - s.a AS dates FROM generate_series(0,182,7) AS s(a)) d 
    LEFT JOIN study ON 
study_date <= d.dates 
WHERE study_name ~ 'T(C|L)S' and study_type ~'G'            
GROUP BY 1 
ORDER BY 1; 

-je obtenir la sortie suivante

dates | count 
------------+------- 
26/06/2017 |  6 
03/07/2017 | 11 
10/07/2017 | 15 
17/07/2017 | 30 
24/07/2017 | 38 
31/07/2017 | 47 
07/08/2017 | 61 
14/08/2017 | 77 

Cela me donne un bon rolli ng compte comme nous faisons plus d'études de type 'G'. Cependant, j'essaie ce qui suit pour diviser ce en plages hebdomadaires

SELECT d.dates, count(*)         
FROM (SELECT (current_date- cast(extract(dow from current_date) as int) + 1) - s.a AS dates FROM generate_series(0,182,7) AS s(a)) d 
    LEFT JOIN study ON 
study_date >= d.dates 
WHERE study_name ~ 'T(C|L)S' and study_type ~ 'G' AND study_date <= myo_date + interval '5' day 
GROUP BY 1 
ORDER BY 1; 

me donne une sortie que je ne comprends pas (j'attendais la différence entre les lignes de sortie ci-dessus)

dates | count 
------------+------- 
13/02/2017 | 79 
20/02/2017 | 79 
27/02/2017 | 79 
06/03/2017 | 79 
13/03/2017 | 79 
20/03/2017 | 79 
27/03/2017 | 79 
03/04/2017 | 79 
10/04/2017 | 79 
17/04/2017 | 79 
24/04/2017 | 79 
01/05/2017 | 79 
08/05/2017 | 79 
15/05/2017 | 79 
22/05/2017 | 79 
29/05/2017 | 79 
05/06/2017 | 79 
12/06/2017 | 79 
19/06/2017 | 79 
26/06/2017 | 74 
03/07/2017 | 70 
10/07/2017 | 68 
17/07/2017 | 53 
24/07/2017 | 44 
31/07/2017 | 34 
07/08/2017 | 22 
14/08/2017 |  3 

Comment puis-je obtenir les chiffres sur une base hebdomadaire? Aussi, comment puis-je ajouter un nombre total de colonnes supplémentaires où study_type peut être quelque chose.

sortie Expected

dates | count 
    ------------+------- 
    26/06/2017 | 6 
    03/07/2017 | 5 
    10/07/2017 | 4 
    17/07/2017 | 15 
    24/07/2017 | 8 
    31/07/2017 | 9 
    07/08/2017 | 14 
    14/08/2017 | 16 
+0

Quelle est la deuxième sortie attendue? –

+0

@TimBiegeleisen essentiellement la différence entre deux lignes sur la première sortie. Nombre d'études effectuées entre le lundi et le vendredi où la date du lundi provient de la série générée – moadeep

+0

Fait @ TimBiegeleisen – moadeep

Répondre

0

Vous pouvez essayer d'utiliser LAG() ici:

WITH cte AS (
    SELECT 
     (current_date- cast(extract(dow from current_date) as int) + 1) - s.a AS dates, 
    COUNT(*) AS cnt 
    FROM generate_series(0,182,7) AS s(a)) d 
    LEFT JOIN study 
     ON study_date <= d.dates 
    WHERE study_name ~ 'T(C|L)S' and study_type ~'G' 
    GROUP BY 1 
) 

SELECT 
    dates, 
    cnt - LAG(cnt, 0) OVER (ORDER BY dates) 
FROM cte; 
+0

Cela me donne ERREUR: erreur de syntaxe à ou près de "AVEC" LIGNE 1: AVEC cte AS ('.? Psql version liée (8.4.20) – moadeep

+0

@moadeep Votre requête a un problème. Modifier ma réponse et placer votre réel requête dans le CTE Je ne peux pas lire dans vos pensées. –