Ajuda SQL Subconsulta (Postgre)

2 respostas
M

Eaí Gurizada, to com um problemão faix tempo… e nunca dá certo

O Enunciado é este: (Problema Real)
Mostrar os produtos por dia, e Contar os seriais (tirando os duplicados) que possuem o cod_Status = 0 (Zero) Excluindo os que estão repetidos no outro grupo onde o cod_Status = 1. na mesma tabela e no mesmo Dia.
Fiz assim:

SELECT a.cod_prod, to_char(a.datah, 'DD/MM/YY') as dia, count(distinct(a.serial)) FROM tb_registro a
	WHERE
		cod_prod LIKE '%' || '11120' || '%' 
		AND date_trunc('month',  datah) =  TO_timestamp('1/2012','MM/YYYY')
		AND cod_status = 0
		AND
		serial not in ( SELECT serial FROM tb_registro WHERE cod_status = 1 AND  date_trunc('day',  a.datah) = date_trunc('day',  datah)  )
	GROUP BY cod_prod, dia
	ORDER BY cod_prod, dia;

Só que não sei se está certo, o banco possui muitas linhas e a subconsulta demora mais de 16 segundos para processar.

Podem me ajudar?
Obrigado.

Saída:
011120;13/01/12;11
011120;16/01/12;124
011120;17/01/12;24
011120;18/01/12;14
011120;19/01/12;6
011120;20/01/12;16
011120;21/01/12;84
011120;23/01/12;92
011120;24/01/12;94

2 Respostas

pmlm

SELECT a.cod_prod, to_char(a.datah, 'DD/MM/YY') as dia, count(distinct(a.serial)) FROM tb_registro a WHERE cod_prod LIKE '%' || '11120' || '%' AND date_trunc('month', datah) = TO_timestamp('1/2012','MM/YYYY') AND cod_status = 0 AND and not exists (SELECT 1 FROM tb_registro where cod_status = 1 AND a.serial = serial and date_trunc('day', a.datah) = date_trunc('day', datah) ) GROUP BY cod_prod, dia ORDER BY cod_prod, dia;

M

Ok !
De 16 segundos foi para 62ms
Obrigado pmlm.
Gostaria de me aprofundar mais em SQL, tens algum livro para indicar?
Vlw

Criado 24 de janeiro de 2012
Ultima resposta 25 de jan. de 2012
Respostas 2
Participantes 2