Patrón de diseño de MS-Access para el último valor de una agrupación

StackOverflow https://stackoverflow.com/questions/47413

  •  09-06-2019
  •  | 
  •  

Pregunta

Es común tener una tabla donde, por ejemplo, los campos son cuenta, valor y tiempo.¿Cuál es el mejor patrón de diseño para recuperar el último valor de cada cuenta?Lamentablemente, la última palabra clave de una agrupación proporciona el último registro físico de la base de datos, no el último registro según ninguna clasificación.Lo que significa que, en mi humilde opinión, nunca debería usarse.Los dos enfoques torpes que uso son un enfoque de subconsulta o una consulta secundaria para determinar el último registro y luego unirme a la tabla para encontrar el valor.¿No existe un enfoque más elegante?

¿Fue útil?

Solución

La opción de subconsulta me parece mejor, algo así como el siguiente psuedo-sql.Puede ser posible/necesario optimizarlo mediante una combinación, que dependerá de las capacidades del motor SQL.

select * 
from table 
where account+time in (select account+max(time) 
                       from table 
                       group by account 
                       order by time) 

Otros consejos

Este es un buen truco para devolver el último registro de una tabla:

SELECT TOP 1 * FROM TableName ORDER BY Time DESC  

Verificar este sitio para más información.

¿No podrías hacer:

select account,last(value),max(time)
from table
group by account

Probé esto (concedido para un conjunto de registros muy pequeño, casi trivial) y produjo resultados adecuados.

Editar:

eso tampoco funciona después de algunas pruebas más.Hice bastante programación de acceso en una vida pasada y siento que hay una manera de hacer lo que pides en 1 consulta, pero en este momento estoy en blanco.Lo siento.

@Tom podría ser más fácil para mí en general hacer la consulta "en" que has sugerido.Generalmente hago algo como

select T1.account, T1.value
from table T as T1
where T1 = (select max(T2.time) from table T as T2 where T1.account = T2.Account) 

Después de literalmente años de búsqueda, finalmente encontré la respuesta en el enlace siguiente #3.Las subconsultas anteriores funcionarán, pero son muy lentas, debilitantemente lentas para mis propósitos.

La respuesta más popular es una consulta de tres niveles:El primer nivel encuentra el máximo, el segundo nivel obtiene los valores de campo basados ​​en la primera consulta.Luego, el resultado se une como una tabla a la consulta principal.Codificar/mantener es rápido pero complicado y requiere mucho tiempo.

Este enlace funciona, aún se ejecuta bastante rápido y requiere mucho menos trabajo de codificación/mantenimiento.Gracias a los autores de este sitio.

http://access.mvps.org/access/queries/qry0020.htm

@shs
sí, esa selección del último (valor) DEBE funcionar, pero no es así...Según tengo entendido, aunque no puedo presentar una fuente autorizada, el último (valor) proporciona el último registro físico en el archivo de acceso, lo que significa que podría ser el primero en el tiempo pero el último físicamente.Así que no creo que debas usar last(value) para nada más que una fila aleatoria realmente mala.

Estoy tratando de encontrar la última fecha en un grupo usando el generador de consultas de Access 2003 y encontré el mismo problema al intentar usar ÚLTIMO para un campo de fecha.Pero parece que al usar MAX se encuentra la última fecha.

Quizás el siguiente SQL sea torpe, pero parece funcionar correctamente en Access.

SELECT
    a.account,
    a.time,
    a.value
FROM
    tablename AS a INNER JOIN [
        SELECT
            account,
            Max(time) AS MaxOftime
        FROM
            tablename
    GROUP BY
        account
    ]. AS b
    ON
        (a.time = b.MaxOftime)
        AND (a.account = b.account)
;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top