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 Réponses :
Utilisez distinct sur
si vous voulez une ligne par id:
select distint on (id) t.* from t order by id, year desc;
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.
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?
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!
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
:
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.
qu'est-ce qu'un identifiant a plus d'un mais pas de 2030?
Je simplifie la question.
À propos de versioning PostgreSQL .