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

Hvad laver/denne dataerklæring i SAS præcist? PostgreSQL tilsvarende?

Udsagnet bruger det, der kaldes 'ved gruppebehandling'. Før trinnet kan køre, kræver det, at dataene er sorteret efter btn wtn resp_ji .

first.resp_ji piece tjekker for at se, om det er første gang, det er set den aktuelle værdi af resp_ji i den aktuelle btn/wtn-kombination. Ligeledes last.resp_ji piece tjekker, om det er sidste gang, det vil se den aktuelle værdi af resp_ji inden for den aktuelle btn/wtn kombination.

Ved at kombinere det hele sammen udsagnet:

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

Siger, hvis den aktuelle værdi af resp_ji forekommer flere gange for den aktuelle kombination af btn/wtn, så behold posten, ellers kasser posten. Opførselen af ​​if sætning, når den bruges på den måde, beholder/kasserer posten implicit.

For at gøre det tilsvarende i SQL, kan du gøre noget som:

  1. Find alle poster, der skal kasseres.
  2. Kassér disse poster fra det originale datasæt.

Så...

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

REDIGER :Jeg bør nævne, at der ikke er nogen simpel SQL-ækvivalent. Det kan være muligt ved at nummerere rækker i underforespørgsler og derefter bygge logik oven i det, men det ville være grimt. Det kan også afhænge af den specifikke smag af SQL, der bruges.



  1. Opsætning af Laravel på en Mac php artisan migreringsfejl:Ingen sådan fil eller mappe

  2. Islands T-SQL Challenge

  3. Windows7 WAMP 64-bit stack MySQL problemer

  4. Sphinx advarsel preload:kunne ikke åbnes