sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Qué hace exactamente la / esta declaración de datos en SAS? ¿Equivalente a PostgreSQL?

La declaración está usando lo que se llama 'procesamiento por grupo'. Antes de que se pueda ejecutar el paso, se requiere que los datos estén ordenados por btn wtn resp_ji .

El first.resp_ji piece está comprobando si es la primera vez que ve el valor actual de resp_ji dentro de la combinación btn/wtn actual. Del mismo modo el last.resp_ji la pieza está comprobando si es la última vez que verá el valor actual de resp_ji dentro de la combinación btn/wtn actual.

Combinando todo junto la declaración:

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

Es decir, si el valor actual de resp_ji ocurre varias veces para la combinación actual de btn/wtn, mantenga el registro; de lo contrario, deséchelo. El comportamiento del if declaración cuando se usa así implícitamente mantiene/descarta el registro.

Para hacer el equivalente en SQL, podría hacer algo como:

  1. Buscar todos los registros para descartar.
  2. Descarta esos registros del conjunto de datos original.

Entonces...

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

EDITAR :Debo mencionar que no existe un equivalente SQL simple. Puede ser posible numerando las filas en las subconsultas y luego creando una lógica además de eso, pero sería horrible. También puede depender del tipo específico de SQL que se utilice.