PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Que fait exactement la/cette déclaration de données dans SAS ? Équivalent PostgreSQL ?

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 :

  1. Rechercher tous les enregistrements à supprimer.
  2. 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é.