Tengo una tabla que es una colección de entradas sobre cuándo un usuario inició sesión.
username, date, value
--------------------------
brad, 1/2/2010, 1.1
fred, 1/3/2010, 1.0
bob, 8/4/2009, 1.5
brad, 2/2/2010, 1.2
fred, 12/2/2009, 1.3
etc..
¿Cómo creo una consulta que me dé la última fecha para cada usuario?
Actualización: olvidé que necesitaba tener un valor que coincida con la última fecha.
sql
greatest-n-per-group
cabeza de pez
fuente
fuente
Respuestas:
fuente
max(date)
devolvería una fecha que uniría múltiples registros). Para evitar este problema, sería preferible utilizar la solución de @ dotjoe: stackoverflow.com/a/2411763/4406793 .Uso de funciones de ventana (funciona en Oracle, Postgres 8.4, SQL Server 2005, DB2, Sybase, Firebird 3.0, MariaDB 10.3)
fuente
username
en este caso) y ni siquiera requiere un campo único "ordenable" (como unirsemax(date)
en otras respuestas).order by date desc, id desc)
.Veo que la mayoría de los desarrolladores usan una consulta en línea sin considerar su impacto en los datos de gran tamaño.
Simplemente, puede lograr esto al:
fuente
Para obtener toda la fila que contiene la fecha máxima para el usuario:
fuente
fuente
Según mi experiencia, la forma más rápida es tomar cada fila para la que no hay una fila más nueva en la tabla.
Otra ventaja es que la sintaxis utilizada es muy simple y que el significado de la consulta es bastante fácil de entender (tome todas las filas de manera que no exista una fila más nueva para el nombre de usuario que se está considerando).
NO EXISTE
NUMERO DE FILA
UNIR INTERNAMENTE
IZQUIERDA COMBINACIÓN EXTERNA
fuente
SELECT username, value FROM t WHERE NOT EXISTS ( SELECT * FROM t AS witness WHERE witness.date > t.date AND witness.username = t.username );
Este debería darle el resultado correcto para su pregunta editada.
La subconsulta se asegura de encontrar solo filas de la última fecha, y el exterior
GROUP BY
se encargará de los vínculos. Cuando hay dos entradas para la misma fecha para el mismo usuario, devolverá la que tenga la más altavalue
.fuente
También puede usar la función de clasificación analítica
fuente
Abordaría el problema actualizado. Puede que no funcione tan bien en tablas grandes, incluso con una buena indexación.
fuente
fuente
Para Oracle ordena el conjunto de resultados en orden descendente y toma el primer registro, por lo que obtendrá el último registro:
fuente
fuente
fuente
Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)
La consulta interna devolverá la última fecha para el usuario actual, la consulta externa extraerá todos los datos de acuerdo con el resultado de la consulta interna.
fuente
Utilicé esta forma de tomar el último registro para cada usuario que tengo en mi mesa. Fue una consulta para obtener la última ubicación del vendedor según el tiempo reciente detectado en los dispositivos PDA.
fuente
fuente
Mi pequeña compilación
join
mejor que anidadoselect
group by
no te daprimary key
cuál es preferible parajoin
partition by
junto confirst_value
( docs )Entonces, aquí hay una consulta:
Pros:
where
declaración utilizando cualquier columnaselect
cualquier columna de filas filtradasContras:
fuente
Hice algo para mi aplicación, ya que:
A continuación se muestra la consulta:
fuente
Esto es similar a una de las respuestas anteriores, pero en mi opinión es mucho más simple y ordenado. Además, muestra un buen uso para la declaración de aplicación cruzada. Para SQL Server 2005 y superior ...
fuente
fuente
Esto también debería funcionar para obtener las últimas entradas para los usuarios.
fuente
Usaría la función agregada MAX y GROUP BY
fuente
value
, no la asociada con laMAX(date)
fila.