1
votes

Existe-t-il un moyen d'obtenir la première ligne d'un groupe dans postgres en fonction de Max (date)

Entrée:

id      name        value1      value2        date

1        A              1    Avg(value2)    2019-07-13
2        B              2    Avg(value2)    2019-07-13
3        C              1    Avg(value2)    2019-07-13

Résultat attendu:

id      name        value1      value2        date

1        A              1           1       2019-01-01
1        A              2           2       2019-02-15
1        A              3           3       2019-01-15
1        A              1           1       2019-07-13

2        B              1           2       2019-01-01
2        B              1           3       2019-02-15
2        B              2           1       2019-07-13

3        C              2           4       2019-02-15
3        C              1           2       2019-01-01
3        C              1           9       2019-07-13
3        C              3           1       2019-02-15


1 commentaires

Veuillez modifier vos entrées de moyenne (valeur2) pour afficher la moyenne attendue. Par exemple. est la valeur moyenne2 pour 3 valeurs comprises ou exclues après la date spécifiée?


3 Réponses :


1
votes

Vous pouvez utiliser les fonctions de fenêtre. rank () over () peut être utilisé pour identifier le premier enregistrement de chaque groupe, et avg () over () vous donnera une moyenne de fenêtre de value2 dans chaque groupe:

select id, name, value1, avg_value2 value2, date
from (
    select 
        t.*,
        avg(value2) over(partition by id, name) avg_value2,
        rank() over(partition by id, name order by date desc) rn
    from mytable t
) t
where rn = 1


3 commentaires

Merci qui a été utile et comment pourrais-je le faire au niveau de l'année


Comme si la date est 2019-07-13 value1 = 5 et la date est 2019-09-13 value = 3. J'ai besoin d'obtenir la date maximale et la valeur pour cette date. Comment pourrais-je le faire? La sortie sera: - 2019-09-13 value1 = 3


@Anonymous: oui la requête fait ça. Il vous donne l'enregistrement qui a la date la plus élevée pour chaque tuple id / nom. Vous pouvez essayer de l'exécuter sur vos données réelles pour voir les résultats par vous-même.



0
votes

triez vos données de la bonne manière, utilisez la fonction window row_number () comme identifiant et sélectionnez la première entrée de chaque partition.

    with temp_data as 
    (
    select
    row_number() over (partition by debug.tbl_data.id order by debug.tbl_data.date desc) as index,
    *,
    avg(debug.tbl_data.value2)over (partition by debug.tbl_data.id) as data_avg
    from debug.tbl_data 
    order by id asc, debug.tbl_data.date desc
    )

    select 
    *
    from temp_data
    where index = 1


0 commentaires

0
votes

Vous semblez vouloir la valeur la plus courante de value1 . En statistique, cela s'appelle le «mode». Vous pouvez le faire comme:

select id, name,
       mode() within group (order by value1) as value1_mode,
       avg(value2),
       max(date)
from t
group by id, name;


0 commentaires