Fórum max date voltando mais de uma data #26809

19/12/2007

0

Olá pessoal tenho a seguinte query:

select
prod.nome as nome_produtor,
faz.nome as nome_fazenda,
faz.end_rua as rua_fazenda,
faz.end_complemento as complemento_fazenda,
faz.end_bairro as bairro_fazenda,
cid.nome_cidade as cidade_fazenda,
uf.sigla_uf as uf_cidade_fazenda,
faz.telefone as telefone_fazenda,
faz.end_cep as cep_fazenda,
faz.email as email_fazenda,
reb.nome_rebanho as rebanho_fazenda,
a.reg_animal_nasc as num_registro,
a.apelido as nome,
[b:74f0f41519]extract(year from MAX(p.data_parto)) as ultimo_parto_ano[/b:74f0f41519],--esta buscando mais de uma data e não apenas a última
[b:74f0f41519]extract(month from MAX(p.data_parto)) as ultimo_parto_mes,
extract(day from MAX(p.data_parto)) as ultimo_parto_dia,[/b:74f0f41519]
(extract(year from(age(a.data_nascimento)))) as idade_ano,
(extract(month from(age(a.data_nascimento))))as idade_mes,
(date(cl.data_controle)) - date(p.data_parto) as dl,
--leite /este campo está sendo estruturado no banco de dados,
cl.ccs as ccs,
cl.ecs as ecs,
extract(year from MAX(cl.data_controle)) as data_ultimo_controle_ano,
extract(month from MAX(cl.data_controle)) as data_ultimo_controle_mes,
extract(day from MAX(cl.data_controle)) as data_ultimo_controle_dia
--média do rebanho
from
produtor as prod,
fazenda as faz,
sis_cidade as cid,
sis_uf as uf,
rebanho as reb,
animal as a,
parto as p,
controle_leiteiro as cl
where
faz.nome = ´FAZENDA CAPAO VERDE´
and reb.nome_rebanho = ´SANTA MONICA´
and prod.id_produtor = faz.id_produtor
and cid.id_cidade = faz.id_cidade
and uf.id_uf = cid.id_uf
and reb.id_fazenda = faz.id_fazenda
and a.id_animal = p.id_animal
and a.id_animal = cl.id_animal
group by
prod.nome,
faz.nome,
faz.end_rua,
faz.end_complemento,
faz.end_bairro,
cid.nome_cidade,
uf.sigla_uf,
faz.telefone,
faz.end_cep,
faz.email,
reb.nome_rebanho,
a.reg_animal_nasc,
a.apelido,
p.data_parto,
a.data_nascimento,
cl.data_controle,
cl.ccs,
cl.ecs

A questão é a seguinte:

Estou querendo que volte apenas a última data porém a query esta voltando mais de uma data. Como faço para que volte apenas a última data?O resultado é o seuinte:

LUIZ RONALDO COSTA JUNQUEIRA,FAZENDA CAPAO VERDE,Conceição das Alagoas,MG,SANTA MONICA,1234A,Campinas N-7680,2000,12,14

LUIZ RONALDO COSTA JUNQUEIRA,FAZENDA CAPAO VERDE,Conceição das Alagoas,MG,SANTA MONICA,1234A,Campinas N-7680,2001,7,12

Esta voltando a data 14/12/2000 em uma linha e na outra esta voltando a data 12/7/2001, quero q volte so esta.


Thiago_bellotti

Thiago_bellotti

Responder

Posts

29/12/2007

Mleal

Thiago,

Acho que vc também vai ter de apelar para uma SubConsulta, conforme abaixo:

´SELECT prod.nome as nome_produtor, faz.nome as nome_fazenda,
faz.end_rua as rua_fazenda, faz.end_complemento as complemento_fazenda, faz.end_bairro as bairro_fazenda,
cid.nome_cidade as cidade_fazenda, uf.sigla_uf as uf_cidade_fazenda,
faz.telefone as telefone_fazenda, faz.end_cep as cep_fazenda,
faz.email as email_fazenda, reb.nome_rebanho as rebanho_fazenda,
a.reg_animal_nasc as num_registro, a.apelido as nome,
extract(year from p.data_parto) as ultimo_parto_ano,
extract(month from p.data_parto) as ultimo_parto_mes,
extract(day from p.data_parto) as ultimo_parto_dia,
extract(year from(age(a.data_nascimento))) as idade_ano,
extract(month from(age(a.data_nascimento)))as idade_mes,
(date(cl.data_controle)) - date(p.data_parto) as dl,
cl.ccs as ccs, cl.ecs as ecs,
extract(year from cl.data_controle) as data_ultimo_controle_ano,
extract(month from cl.data_controle) as data_ultimo_controle_mes,
extract(day from cl.data_controle) as data_ultimo_controle_dia

FROM
produtor as prod, fazenda as faz, sis_cidade as cid, sis_uf as uf,
rebanho as reb, animal as a, parto as p, controle_leiteiro as cl

WHERE
faz.nome = ´FAZENDA CAPAO VERDE´
AND reb.nome_rebanho = ´SANTA MONICA´
AND prod.id_produtor = faz.id_produtor
AND cid.id_cidade = faz.id_cidade
AND uf.id_uf = cid.id_uf
AND reb.id_fazenda = faz.id_fazenda
AND a.id_animal = p.id_animal
AND a.id_animal = cl.id_animal

[b:b71094ae74]AND p.data_parto IN (SELECT MAX(p.data_parto) FROM parto)[/b:b71094ae74]

GROUP BY prod.nome, faz.nome, faz.end_rua, faz.end_complemento,
faz.end_bairro, cid.nome_cidade, uf.sigla_uf, faz.telefone, faz.end_cep,
faz.email, reb.nome_rebanho, a.reg_animal_nasc, a.apelido,
p.data_parto, a.data_nascimento, cl.data_controle, cl.ccs, cl.ecs

Observe a linha em negrito. Ela implementa a subconsulta, restringindo todos os resultados à maior data de parto. Como a subconsulta implementa o filtro principal, as funções MAX espalhadas na claúsula SELECT perdem o sentido.

abçs

MLeal :P


Responder

Gostei + 0

09/01/2008

Thiago_bellotti

Olá MLeal, obrigado pela atenção.
Coloquei na consulta a condição em negrito e retirei do select os max.
Rodou mas não voltou nada, o que não era pra acontecer já que existem duas linhas na tabela, sendo uma com data diferente da outra.

Tem alguma outra alternativa?

[]´s


Responder

Gostei + 0

09/01/2008

Mleal

Thiago,

Vc. pode me passar algumas linhas da(s) tabela(s) com a definição e conteúdo dos campos (pode ser em uma planilha Excel). Eu importarei os dados para uma tabela do PostgreSQL e farei testes.

Aguardo.

abçs


Responder

Gostei + 0

10/01/2008

Mleal

Thiago,

Tentei reproduzir seu problema e montei algumas tabelas com base na sua consulta.

1 - Qual a diferença entre data_nascimento e data_parto ? Não são a mesma coisa. De qq. modo, só há uma data_parto para o animal. Ela não poderia figurar na mesma tabela de animais ?
2 - Um animal deve pertencer a um rebanho (relacionar-se com ele). Não encontrei esta chave na sua consulta.
3 - Um rebanho deve pertencer a uma fazenda (relcionar-se com ela). Também não encontrei esta chave na sua consulta.
4 - A tabela controle_leiteiro tem uma chave de relacionamento apenas com animais. Se vc. rever os itens 2 e 3, dá para fazer a consulta, mas o resultado de qq. forma será um produto cartesiano com a tabela controle_leiteiro.

Verifique.


Responder

Gostei + 0

16/01/2008

Thiago_bellotti

Acho que encontrei o problema.

Quando coloco mais de uma linha com id_animal iguais na tabela de controle_leitero com data_controle diferente ele volta mais de um registro.

Por exemplo:

Na tabela controle_leiteiro possui um id_animal = 411 com data_controle = 21/12/2008, assim ele volta apenas uma linha pois existe apenas um id_animal(411) para uma data.

Caso eu coloque o id_animal 411 em outra linha com data_controle = 21/08/2006 ficam duas linhas com id_animal 411 e datas diferentes, porém
ao invés de voltar apenas a linha que tem 21/12/2008 voltam as duas linhas.

Em relação a suas perguntas, é o seguinte:

data_nascimento é a data que este animal que estou buscando nasceu, mas essa data eu peo apenas para calcular a idade do animal, já data_parto é a data em que este animal pariu outro.

Em relação ao relacionamento com rebanho, não coloquei pois com o id_fazenda ja se consegue saber qual o rebanho


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar