Oracle - Limitar 1 registro(PK) por dia
Boa tarde.
Possuo um relatório que devo listar a quantidade de "interações" que um determinado usuário teve em determinada tabela.
Diante disso:
Porém preciso que apenas um registro seja exibido por dia, mesmo que o usuário tenha criado. Da forma atual, caso um determinado usuário faça 2 interações em 1 dia, ele vai me retornar 2 linhas, uma para cada cd_interacao. Preciso que apenas uma delas seja listada. Tentei utilizar a função MAX, mas não consegui, mas só consegui a última interação geral, e não a última (ou única) interação de cada usuário, em cada data.
Ou seja, caso exista
cd_interacao | nm_usuario| data
123 | teste | 01/08/2019
456 | teste | 01/08/2019
Preciso que apenas 1 dos dois seja exibido.
Alguém tem alguma dica?
Obrigado
Possuo um relatório que devo listar a quantidade de "interações" que um determinado usuário teve em determinada tabela.
Diante disso:
select cd_interacao, nm_usuario, dt_interacao, nr_atendimento, obter_nome_pessoa_fisica(cd_pessoa_fisica,null) nmpaciente from interacoes where ie_tipo_interacao=''EM'' and trunc(dt_interacao,''dd'') between :dt_inicial and :dt_final order by nm_usuario, dt_interacao asc
Porém preciso que apenas um registro seja exibido por dia, mesmo que o usuário tenha criado. Da forma atual, caso um determinado usuário faça 2 interações em 1 dia, ele vai me retornar 2 linhas, uma para cada cd_interacao. Preciso que apenas uma delas seja listada. Tentei utilizar a função MAX, mas não consegui, mas só consegui a última interação geral, e não a última (ou única) interação de cada usuário, em cada data.
Ou seja, caso exista
cd_interacao | nm_usuario| data
123 | teste | 01/08/2019
456 | teste | 01/08/2019
Preciso que apenas 1 dos dois seja exibido.
Alguém tem alguma dica?
Obrigado
Diego
Curtidas 0
Melhor post
Douglas Wordell
06/08/2019
Já tentou algo assim?
Como você só precisa interação exclusiva do "usuário na data" os outros campos serão irrelevantes, certo?
select nm_usuario, dt_interacao, count(*) from interacoes where ie_tipo_interacao=''EM'' and trunc(dt_interacao,''dd'') between :dt_inicial and :dt_final group by nm_usuario, dt_interacao order by nm_usuario, dt_interacao asc
Como você só precisa interação exclusiva do "usuário na data" os outros campos serão irrelevantes, certo?
GOSTEI 1
Mais Respostas
Diego
06/08/2019
Já tentou algo assim?
Como você só precisa interação exclusiva do "usuário na data" os outros campos serão irrelevantes, certo?
select nm_usuario, dt_interacao, count(*) from interacoes where ie_tipo_interacao=''EM'' and trunc(dt_interacao,''dd'') between :dt_inicial and :dt_final group by nm_usuario, dt_interacao order by nm_usuario, dt_interacao asc
Como você só precisa interação exclusiva do "usuário na data" os outros campos serão irrelevantes, certo?
Olá Douglas. Dessa forma apontada ele simplesmente vai retornar 1 no count para cada linha apresentada, repetindo todas as linhas com cd_interacao diferentes, do mesmo usuário na mesma data.
O nome do usuário e data podem se repetir na linha, o cd_interacao que é diferente, e preciso listar apenas 1 linha por usuário e data, independente de quantas cd_interacao ele tiver no dia. Tentei pegar o cd_interacao mais alto, guardar, e no contador abaixo comparar, mas continuo tendo 2 linhas diferentes
SELECT MAX(cd_interacao), dt_interacao, nm_usuario,nr_atendimento, obter_nome_pessoa_fisica(cd_pessoa_fisica,null) nmpaciente FROM interacoes where ie_tipo_interacao='EM' and trunc(dt_interacao,'dd') between :dt_inicial and :dt_final GROUP BY dt_interacao, nm_usuario, nr_atendimento, obter_nome_pessoa_fisica(cd_pessoa_fisica,null) HAVING count(cd_interacao) = 1 order by nm_usuario asc
Exemplo de saída. Nessa mesma data (03/08), com essa mesma usuária, com essa mesma pessoa, com esse mesmo atendimento(51727), tive 2 cd_interacao, a 39506 e 39507. A idéia era que o MAX pegasse somente o 39507 mas não estou conseguindo.
39506 03/08/19 Fabiana 51727 João da Silva
39507 03/08/19 Fabiana 51727 João da Silva
GOSTEI 0
Douglas Wordell
06/08/2019
Na minha interpretação o select que passei deveria fazer isso, você pode compartilhar o DDL da sua tabela e uns registros de exemplo?
GOSTEI 0
Diego
06/08/2019
Na minha interpretação o select que passei deveria fazer isso, você pode compartilhar o DDL da sua tabela e uns registros de exemplo?
Olá Douglas, consegui. O Max não estava surtindo efeito pois no meu caso, ele precisava estar em uma subquery para comparar com o "primeiro bloco".
Segue a solução.
select a1.nm_usuario, a1.nr_atendimento, obter_nome_pessoa_fisica(a1.cd_pessoa_fisica,null) nmpaciente, a1.dt_interacao, a1.cd_interacao from interacoes a1, (select max(cd_interacao) as interacao1, nr_atendimento from interacoes group by nr_atendimento) resultados where a1.nr_atendimento=resultados.nr_atendimento and a1.ie_tipo_interacao='EM' and a1.cd_interacao=resultados.interacao1 and trunc(a1.dt_interacao,'dd') between :dt_inicial and :dt_final order by nm_usuario asc
Obrigado pela atenção e apoio!
GOSTEI 1