PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Was genau macht die/diese Datenanweisung in SAS? PostgreSQL-Äquivalent?

Die Anweisung verwendet, was als "by group processing" bezeichnet wird. Bevor der Schritt ausgeführt werden kann, müssen die Daten nach btn wtn resp_ji sortiert werden .

Die first.resp_ji piece überprüft, ob es das erste Mal ist, dass es den aktuellen Wert von resp_ji innerhalb der aktuellen btn/wtn-Kombination sieht. Ebenso die last.resp_ji piece prüft, ob es das letzte Mal ist, dass es den aktuellen Wert von resp_ji sieht innerhalb der aktuellen btn/wtn-Kombination.

Alles zusammen die Aussage:

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

Das heißt, wenn der aktuelle Wert von resp_ji mehrmals für die aktuelle Kombination von btn/wtn auftritt, dann den Datensatz behalten, andernfalls den Datensatz verwerfen. Das Verhalten von if Anweisung, wenn sie so verwendet wird, behält/verwirft implizit den Datensatz.

Um das Äquivalent in SQL auszuführen, könnten Sie Folgendes tun:

  1. Alle zu verwerfenden Datensätze finden.
  2. Verwerfen Sie diese Datensätze aus dem ursprünglichen Datensatz.

Also...

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

BEARBEITEN :Ich sollte erwähnen, dass es kein einfaches SQL-Äquivalent gibt. Es kann möglich sein, Zeilen in Unterabfragen zu nummerieren und dann Logik darauf aufzubauen, aber es wäre hässlich. Es kann auch von der spezifischen Variante von SQL abhängen, die verwendet wird.