J'ai des horodatages dans une table et je veux créer une variable factice (0 ou 1) qui teste si la ligne ci-dessus est égale à la ligne actuelle, une fois les horodatages triés. Je dois le faire dans différentes partitions. Existe-t-il une fonction de fenêtre qui peut faire cela dans SQL Server?

Je connais donc ma partition par colonne et ordre par colonne. D'après ma connaissance des fonctions de fenêtre, j'ai peut-être besoin d'utiliser une fonction de classement, mais y a-t-il un moyen d'écrire cela avec des fonctions imbriquées en utilisant IIF et LEAD ou LAG pour vérifier une condition entre les lignes dans une partition?

-3
David 27 août 2020 à 23:25

2 réponses

Meilleure réponse

La table SQL représente des ensembles non ordonnés. Si vous avez une colonne de classement distincte des horodatages, vous pouvez utiliser:

select t.*,
       (case when lag(timestamp) over (partition by <partition col> order by <order col>) = timestamp
             then 1 else 0
        end) as flag   
from t;
2
Gordon Linoff 27 août 2020 à 20:29

SQL est un langage défini, donc il n'y a pas de ci-dessus ou de dessous, mais ils ont créé quelque chose comme ça, une portabilité limitée, à la demande générale. Vous pouvez écrire une procédure qui traite les lignes ordonnées en se souvenant des valeurs précédentes, amorçant cette mémoire avec quelque chose pour la première ligne. Toujours pas d'accès à la rangée suivante! Retour aux feuilles de calcul? Ou enregistrez les informations pour la ligne actuelle et la ligne précédente jusqu'à la ligne suivante, et affichez la ligne une ligne en retard, mais qu'en est-il de la dernière ligne? Même dans les feuilles de calcul, vous avez une rangée du haut et du bas!

-2
David Pickett 27 août 2020 à 20:34