Oracle - Limitar 1 registro(PK) por dia

SQL

Oracle

Oracle PL SQL

06/08/2019

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:
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

Diego

Curtidas 0

Melhor post

Douglas Wordell

Douglas Wordell

06/08/2019

Já tentou algo assim?

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

Diego

06/08/2019

Já tentou algo assim?

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

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

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
POSTAR