1
votes

Comment sélectionner une liste d'années x nombre d'années à partir de cette année

Tentative de construction d'une instruction select dans psql avec une liste d'années correspondant à (x) nombre d'années avant "cette année".

Modifications de la réponse fournie dans SQL pour retourner liste des années depuis une année spécifique de travail pour sql, mais pas pour postgres.

J'ai essayé de bricoler avec generate_series, mais sans succès.


0 commentaires

3 Réponses :


1
votes

Utilisez -1 pas. Exemple x = 15

select 
    extract(year from x.y)
from 
    generate_series(
        current_timestamp, 
        current_timestamp - interval '1 year' * 15, 
        interval '-1 year'
    ) as x(y)

Une autre approche:

select * 
from 
    generate_series(
        extract(year from current_date)::int, 
        extract(year from current_date)::int - 15, 
        -1
    )

Test en direct: https://www.db-fiddle.com/f/shVQnibndNh45uCZxt4jgs/3

https://www.db-fiddle.com/f/shVQnibndNh45uCZxt4jgs/0


1 commentaires

Merci! Travaillé. A pris la première option et l'a enveloppée dans une clause «With» afin d'obtenir le résultat final sous forme de caractère, ce qui semble fonctionner. avec yearlist as (select * from generate_series (extract (year from current_date) :: int, extract (year from current_date) :: int - 70, -1) as Years) select cast (Years as CHAR (4)) from yearlist



0
votes

Un peu plus court: vous pouvez également utiliser la variante numérique du generate_series et transtypez la valeur de retour de la EXTRACT fonctionne directement, par exemple:

SELECT
    EXTRACT(YEAR FROM CURRENT_DATE + ('1y'::interval * x))::text AS year
FROM
    generate_series(-7, -1) AS x
;


0 commentaires

0
votes

Si vous arrivez à ce que les «années» sont des dates, vous pouvez faire:

with recursive yearlist as  (
      select extract(year from now()) as year, 1 as lev
      union all
      select yl.year - 1 as year, lev + 1
      from yearlist yl
      where lev < 15
  )
select year
from yearlist
order by year desc;

(C'est ainsi que je voudrais normalement une liste d'années.)

Plus important encore, vous pouvez facilement adapter le code SQL Server à Postgres:

select *
from generate_series(date_trunc('year', now()) - interval '15 year',
                     date_trunc('year', now()),
                     interval '1 year'
                    )

Je recommande plutôt generate_series () , mais je veux démontrer que Postgres prend également en charge les CTE récursifs.


0 commentaires