PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O que exatamente esta declaração de dados no SAS está fazendo? Equivalente ao PostgreSQL?


A instrução está usando o que é chamado de 'processamento por grupo'. Antes que a etapa possa ser executada, ela exige que os dados sejam classificados por btn wtn resp_ji .

O first.resp_ji peça está verificando se é a primeira vez que vê o valor atual de resp_ji dentro da combinação btn/wtn atual. Da mesma forma, o last.resp_ji peça está verificando se é a última vez que verá o valor atual de resp_ji dentro da combinação btn/wtn atual.

Combinando tudo, a declaração:
if not (first.resp_ji and last.resp_ji);

Está dizendo que, se o valor atual de resp_ji ocorrer várias vezes para a combinação atual de btn/wtn, mantenha o registro, caso contrário, descarte o registro. O comportamento do if quando usado assim implicitamente mantém/descarta o registro.

Para fazer o equivalente em SQL, você poderia fazer algo como:
  1. Encontre todos os registros para descartar.
  2. Descarte esses registros do conjunto de dados original.

Então...
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 :devo mencionar que não existe um equivalente SQL simples. Pode ser possível numerar linhas em subconsultas e, em seguida, criar lógica em cima disso, mas seria difícil. Também pode depender do tipo específico de SQL que está sendo usado.