es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SQL: Seleccionar el saldo más reciente por usuarios únicos en un registro de transacciones de tabla.

Tengo una TABLA de registros de saldos transnacionales de la siguiente forma:

TIMESTAMP         |   Nombre  |   SALDO
------------------+---------+-----------
1/6/2022 17:57:51 | Usuario_1  |     45
1/6/2022 15:57:27 | Usuario_2  |     15
1/6/2022 12:27:27 | Usuario_1  |    251
1/6/2022 11:17:22 | Usuario_3  |   1500
1/6/2022 10:11:22 | Usuario_2  |   5301
1/6/2022 10:57:18 | Usuario_3  |   2351
1/6/2022 10:23:14 | Usuario_4  |   1542
1/6/2022 10:17:09 | Usuario_4  |    424

Quiero extraer una tabla con la última hora y el último saldo. Intenté:

select 
    s1.Nombre, s1.SALDO, s1.TIMESTAMP, s2.Email_s2
from 
    TABLA s1
right join 
    (select 
         Nombre, max(TIMESTAMP) as TIMESTAMP
     from TABLA
     group by Nombre
     order by date desc) s2 on s1.Email = s2.Email_s2
where 
    s1.SALDO is not null
order by 
    TIMESTAMP desc

Pero la salida sigue mostrando valores duplicados. ¿Alguna sugerencia?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que la consulta que has escrito está utilizando un RIGHT JOIN para combinar la subconsulta con la tabla original. Sin embargo, la subconsulta en sí también está seleccionando la columna Name, lo que significa que la unión no es necesaria en este caso.

    Aquí tienes una posible modificación de tu consulta que debería eliminar los valores duplicados:

    select 
        s1.Name, s1.Balance, s1.timestamp
    from 
        TABLE s1
    inner join 
        (select 
             Name, max(timestamp) as max_ts
         from TABLE
         group by Name) s2 
    on s1.Name = s2.Name and s1.timestamp = s2.max_ts
    order by 
        s1.Timestamp desc
    

    En esta consulta actualizada, he utilizado un INNER JOIN entre la tabla original y la subconsulta, lo que significa que solo se devolverán las filas coincidentes. La subconsulta selecciona la columna Name y el valor máximo de timestamp para cada nombre. Luego, esta subconsulta se une nuevamente a la tabla original en las columnas Name y timestamp. Esto devolverá solo las filas de la tabla original que coinciden con el valor de timestamp máximo para cada nombre.

    ¡Espero que esto te ayude!

Comments are closed.