PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Che cosa sta facendo esattamente la/questa dichiarazione di dati in SAS? Equivalente a PostgreSQL?

L'istruzione utilizza ciò che viene chiamato "elaborazione per gruppo". Prima che il passaggio possa essere eseguito, è necessario che i dati siano ordinati per btn wtn resp_ji .

Il first.resp_ji pezzo sta verificando se è la prima volta che vede il valore corrente di resp_ji all'interno della combinazione btn/wtn corrente. Allo stesso modo il last.resp_ji pezzo sta controllando se è l'ultima volta che vedrà il valore corrente di resp_ji all'interno dell'attuale combinazione btn/wtn.

Combinando il tutto insieme la dichiarazione:

if not (first.resp_ji and last.resp_ji);

Sta dicendo, se il valore corrente di resp_ji si verifica più volte per la combinazione corrente di btn/wtn, allora mantieni il record, altrimenti scarta il record. Il comportamento di if istruzione se usata in questo modo mantiene/elimina implicitamente il record.

Per fare l'equivalente in SQL, potresti fare qualcosa come:

  1. Trova tutti i record da eliminare.
  2. Elimina quei record dal set di dati originale.

Allora...

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

MODIFICA :Dovrei menzionare che non esiste un semplice equivalente SQL. Potrebbe essere possibile numerando le righe nelle sottoquery e quindi costruendo la logica in aggiunta a ciò, ma sarebbe brutto. Può anche dipendere dal tipo specifico di SQL utilizzato.