J'ai un tableau avec des colonnes de date, d'heures et d'identifiant de poste. Lorsque nous exécutons notre paie, chaque travailleur a une entrée avec ses heures travaillées pour cette semaine et la date est la période se terminant pour la semaine. Donc, vous verrez des données quelque chose comme ...
Job Id Hours Week Ending Date 1 40 10/25/19 2 40 10/25/19 3 0 10/25/19 1 40 10/18/19 2 40 10/18/19 3 0 10/18/19 1 40 10/21/19 2 40 10/21/19 3 40 10/21/19
Notez que pour l'ID de poste 3, nous avons 2 fins de semaine consécutives avec 0 heure. J'ai besoin d'écrire une requête qui renvoie ce jobid - où il y a plus de 2 semaines consécutives avec 0 heure. Avez-vous une idée de la façon d'écrire cette requête?
3 Réponses :
Vous pouvez utiliser lag () ou lead():
select distinct job_id
from (select t.*,
lead(hours) over (partition by job_id order by week_ending_date) as next_hours
from t
) t
where hours = 0 and next_hours = 0;
Ce qui précède répond formellement à votre question sur l'obtention de ces identifiants de poste . Vous pouvez également sélectionner des informations sur les semaines.
Merci, mais cela me donne des emplois avec une seule entrée. Je recherche au moins 2 semaines consécutives avec 0 heure. La réponse forpas ci-dessus a fonctionné.
@geoffswartz. . . Cela ne devrait donner qu'au moins deux semaines - sauf si vous avez des entrées en double pour un emploi dans une semaine. Êtes-vous sûr de l'avoir correctement implémenté? Comprenez-vous ce que fait lead () ?
Avec EXISTS:
> Job Id | Hours | WeekEndingDate > -----: | ----: | :---------- > 3 | 0 | 25/10/2019 > 3 | 0 | 18/10/2019
Voir le démo .
Résultats:
select t.* from tablename t where t.[Hours] = 0 and exists ( select 1 from tablename where [Job Id] = t.[Job Id] and [Hours] = 0 and abs(datediff(day, [WeekEndingDate], t.[WeekEndingDate])) = 7 )
Cela vous donnera un enregistrement pour chaque période où il y a 0 heure travaillée.
select
a.[job id]
, max(a.number_of_weeks) as number_of_weeks
from (
select
[job id]
, [hours]
, [Week Ending Date]
, sum([hours]) over (partition by [job id], [hours] order by [job id], [Week Ending Date] desc ) as hour_count
, row_number() over (partition by [job id], [hours] order by [job id], [Week Ending Date] desc ) as number_of_weeks
from jobs
) as a
where a.hour_count = 0
group by a.[job id]
having MAX(a.number_of_weeks) > 1
quelle version du serveur SQL?
version 14.0.3035.2