Ajuda SQL Subconsulta (Postgre)

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

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;

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