3
votes

generate_series () équivalent dans snowflake

J'essaie de trouver l'équivalent flocon de neige de generate_series () (la syntaxe PostgreSQL).

SELECT generate_series(timestamp '2017-11-01', CURRENT_DATE, '1 day')


1 commentaires

Snowflake prend-il en charge les expressions de table communes récursives?


3 Réponses :


0
votes

C'est ainsi que j'ai pu générer une série de dates dans Snowflake. J'ai défini le nombre de lignes sur 1095 pour obtenir 3 ans de dates, vous pouvez bien sûr changer cela pour ce qui convient à votre cas d'utilisation

select 
    dateadd(day, '-' || seq4(), current_date()) as dte 
from 
    table 
       (generator(rowcount => 1095))

Initialement trouvé ici

EDIT: Cette solution n'est pas correcte. seq4 ne garantit pas une séquence sans espaces. Veuillez suivre les autres réponses, pas celle-ci. Merci @Marcin Zukowski pour l'avoir signalé.



8
votes

Je voulais juste développer le commentaire de Marcin Zukowski pour dire que ces lacunes ont commencé à apparaître presque immédiatement après avoir utilisé une plage de dates générée de cette manière dans un JOIN .

Nous avons finalement fini par le faire à la place!

select
  dateadd(
    day,
    '-' || row_number() over (order by null),
    dateadd(day, '+1', current_date())
  ) as date
from table (generator(rowcount => 90))


1 commentaires

Je pense que c'est la meilleure réponse car elle devrait générer les dates sans lacunes pour un grand nombre de lignes.



2
votes

J'ai eu un problème similaire et j'ai trouvé une approche, qui évite le problème d'un générateur nécessitant une valeur constante en utilisant une variable de session en plus des réponses déjà excellentes ici. C'est à mon avis le plus proche de l'exigence du PO.

-- set parameter to be used as generator "constant" including the start day
set num_days =  (Select datediff(day, TO_DATE('2017-11-01','YYYY-MM-DD'), current_date()+1));
-- use parameter in bcrowell's answer now
select
  dateadd(
    day,
    '-' || row_number() over (order by null),
    dateadd(day, '+1', current_date())
  ) as date
from table (generator(rowcount => ($num_days)));
-- clean up previously set variable
unset num_days;


0 commentaires