L'instruction utilise ce qu'on appelle le "traitement par groupe". Avant que l'étape puisse s'exécuter, elle nécessite que les données soient triées par btn wtn resp_ji
.
Le first.resp_ji
piece vérifie si c'est la première fois qu'il voit la valeur actuelle de resp_ji dans la combinaison btn/wtn actuelle. De même le last.resp_ji
pièce vérifie si c'est la dernière fois qu'elle verra la valeur actuelle de resp_ji
dans la combinaison actuelle btn/wtn.
En combinant tout cela, la déclaration :
if not (first.resp_ji and last.resp_ji);
Cela signifie que si la valeur actuelle de resp_ji se produit plusieurs fois pour la combinaison actuelle de btn/wtn, conservez l'enregistrement, sinon supprimez l'enregistrement. Le comportement de if
déclaration lorsqu'elle est utilisée comme cela conserve/supprime implicitement l'enregistrement.
Pour faire l'équivalent en SQL, vous pourriez faire quelque chose comme :
- Rechercher tous les enregistrements à supprimer.
- Supprimer ces enregistrements de l'ensemble de données d'origine.
Alors...
create table rows_to_discard as
select btn, wtn, resp_ji, count(*) as freq
from mytable
group by btn, wtn, resp_ji
having count(*) = 1
create table want as
select a.*
from mytable a
left join rows_to_discard b on b.btn = a.btn
and b.wtn = a.wtn
and b.resp_ji = a.resp_ji
where b.btn is null
MODIFIER :Je dois mentionner qu'il n'y a pas d'équivalent SQL simple. Cela peut être possible en numérotant les lignes dans les sous-requêtes, puis en construisant une logique en plus de cela, mais ce serait moche. Cela peut également dépendre de la saveur spécifique du SQL utilisé.