* Bonjour, *

J'ai un jeu de lignes avec dans une colonne un seuil maximum à ne pas dépasser.
=> Des employés avec une durée de travail hebdomadaire

J'ai ensuite une série de ligne en face desquelles je dois mettre une et une seule ligne de mon jeu de données précédent. Pour le moment, pas de notion d'ordre ou de priorité : premier trouvé, premier utilisé.
=> Un planning, où pour chaque heure je dois avoir un employé en activité

Cela implique donc que lorsque je mets un employé sur une case du planning, je dois décrémenter son seuil d'heures, sans pour autant modifier le seuil des autres.
Comment faire ?

Plutôt qu'un long discours, voici ma requête actuelle :

Les deux premières CTE sont là pour éviter d'avoir à crée des tables.

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
with horaire (heure)
as
(
    select 1 heure
    union all
    select heure + 1 from horaire where heure < 10
),
employe (id, temps_travail)
as
(
    select 1, 3
    union all
    select 2, 4
    union all
    select 3, 5
),
occupation (heure, id, duree, temps_travail)
as
(
    select horaire.heure, employe.id, count(*) over(partition by employe.id order by horaire.heure) duree, employe.temps_travail
    from horaire
    cross join employe
)
select *
from occupation
where temps_travail >= duree;

Ce qui me donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
heure       id          duree       temps_travail
----------- ----------- ----------- -------------
1           1           1           3
2           1           2           3
3           1           3           3
1           2           1           4
2           2           2           4
3           2           3           4
4           2           4           4
1           3           1           5
2           3           2           5
3           3           3           5
4           3           4           5
5           3           5           5
 
(12*ligne(s) affectée(s))
Moi j'aurais préféré...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
heure       id          duree       temps_travail
----------- ----------- ----------- -------------
 1          1           1           3
 2          1           2           3
 3          1           3           3
 4          2           1           4
 5          2           2           4
 6          2           3           4
 7          2           4           4
 8          3           1           5
 9          3           2           5
10          3           3           5
 
(10*ligne(s) affectée(s))
Évidemment, je cherche à faire ça "proprement", c'est à dire sans langage procédural.

* Merci *