1
votes

Obtenez une seule ligne par ID à partir d'une requête SQL avec une condition spécifique

J'utilise Postgres v> 9.

J'aimerais obtenir les valeurs d'une table comme celle-ci:

id  year   value
1   2015   0.1
2   2015   0.2
6   2030   0.3

L'idée est d'obtenir les lignes où years est

id  year   value
1   2015   0.1
2   2015   0.2
6   2030   0.3
6   2015   0.4
6   2017   0.3


3 commentaires

qu'est-ce qu'un identifiant a plus d'un mais pas de 2030?


Je simplifie la question.


À propos de versioning PostgreSQL .


3 Réponses :


0
votes

Utilisez distinct sur si vous voulez une ligne par id:

select distint on (id) t.*
from t
order by id, year desc;


2 commentaires

Ok, mais j'ai besoin d'une ligne spécifique, seulement celle "année 2030" pour id = 6.


@MauroAssis. . . C'est la ligne qui est renvoyée, compte tenu des données dont vous disposez.



0
votes
 SELECT ID,
        FIRST_VALUE(YEAR) OVER (PARTITION BY ID ORDER BY YEAR DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS year,
        FIRST_VALUE(Value) OVER (PARTITION BY ID ORDER BY YEAR DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS value  
 FROM t 
 WHERE YEAR = 2030 OR YEAR < 2019
I think this is the standard for first_value -- postgre might require a seperate clause?

3 commentaires

Je voudrais ajouter un mot-clé DISTINCT après SELECT dans votre suggestion, et cela a fonctionné.


oh c'est vrai, j'oublie toujours le distinct lorsque j'utilise les premières valeurs sans groupby.


Tks, Hogan, j'ai déjà mis la "vraie" phrase et ça a marché comme un charme!



1
votes

Cela ne prend en compte que l'année 2030 ou n'importe quelle année Il sélectionne une ligne par id , avec la dernière année en premier.

SELECT DISTINCT ON (id) *
FROM   tbl
ORDER  BY id, year DESC
WHERE (year = 2030 OR year < 2019);

Si c'est possible être plusieurs lignes avec le même (id, année) , vous avez besoin d'un départage.
À propos de ceci et plus de détails pour DISTINCT ON :


2 commentaires

Cela n'obtiendra pas plus d'une valeur pour id = 6? ou l'année desc gère cela?


Exactement une ligne par id existant. Exemple d'explication dans le lien fourni.