Ce que vous essayez de faire est de regrouper les absences par mois consécutifs. Laissez-moi supposer que vous utilisez une base de données raisonnable qui prend en charge la fonction dense_rank()
et les fonctions de la fenêtre de base.
L'idée est de trouver des mois en séquence qui ont des absences. Ensuite, comptez le nombre de mois dans chaque séquence pour chaque employé et gardez ceux qui ont plus de trois mois.
La requête le fait en convertissant le mois en un nombre de mois - 12 fois l'année plus le mois. Il utilise ensuite une observation simple. Le numéro du mois moins une séquence de nombres est une constante, pour des mois consécutifs. Habituellement, j'utilise row_number()
pour la séquence. Parce que vous avez des absences en double dans un mois, j'utilise dense_rank()
.
select emp_no, absent_date
from (select a.*,
max(monthnum) over (partition by emp_no, groupnum) as lastmonth,
min(monthnum) over (partition by emp_no, groupnum) as firstmonth
from (select a.*,
monthnum - dense_rank() over (partition by emp_no order by monthnum) as groupnum
from (select a.*,
year(a.absent_date)*12+month(a.absent_date) as monthnum
from Attendance a
) a
) a
) a
where lastmonth - firstmonth >= 2
Enfin, parce que vous voulez que les dates absents - par opposition aux seuls chiffres des employés - je trouve le premier et le dernier mois en utilisant des fonctions de fenêtre et d'utiliser leur différence comme un filtre.
Merci. Mais comment utiliser ce '+ 1 MOIS' ici? –
Voir le violon, je l'ai changé là-bas, donc cela fonctionne avec MySQL. Si vous utilisez un autre serveur, vous devrez adapter la syntaxe en conséquence. –
J'utilise MS SQL. J'ai ajouté 1 mois avec la date d'absence. Mais il montre plus d'enregistrements que réels. –