name keywords google etiquetas ejemplos description database postgresql

database - keywords - meta tags generator



uniendo la Ășltima de varias etiquetas de metadatos de usuario a filas de usuarios (3)

Supongo que no estás dispuesto a modificar tu esquema, así que me temo que mi respuesta podría no ser de mucha ayuda, pero aquí va ...

Una posible solución sería tener el campo de tiempo vacío hasta que sea reemplazado por un valor más nuevo, cuando inserte la ''fecha de obsolescencia''. Otra forma es expandir la tabla con una columna ''activa'', pero eso introduciría cierta redundancia.

La solución clásica sería tener los campos ''Válido desde'' y ''Válido'' hasta donde los campos ''Válido'' estén en blanco hasta que alguna otra entrada sea válida. Esto se puede manejar fácilmente mediante el uso de activadores o similares. El uso de restricciones para garantizar que solo haya un elemento de cada tipo que sea válido garantizará la integridad de los datos.

Común a esto es que hay una sola forma de determinar el conjunto de campos actuales. Simplemente debe seleccionar todas las entradas con el usuario activo y un NULL ''válido'' o ''fecha de obsolescencia'' o un verdadero ''activo''.

Puede interesarle echar un vistazo a la entrada de Wikipedia en las bases de datos temporales y al artículo Un glosario de consenso de conceptos de bases de datos temporales .

Tengo una base de datos postgres con una tabla de usuario (userid, firstname, lastname) y una tabla de metadatos de usuario (ID de usuario, código, contenido, fecha de creación). Guardo información diversa sobre cada usuario en la tabla de metadatos de usuarios por código y mantengo un historial completo. así, por ejemplo, un usuario (ID de usuario 15) tiene los siguientes metadatos:

15, ''QHS'', ''20'', ''2008-08-24 13:36:33.465567-04'' 15, ''QHE'', ''8'', ''2008-08-24 12:07:08.660519-04'' 15, ''QHS'', ''21'', ''2008-08-24 09:44:44.39354-04'' 15, ''QHE'', ''10'', ''2008-08-24 08:47:57.672058-04''

Necesito buscar una lista de todos mis usuarios y el valor más reciente de cada uno de varios códigos de metadatos de usuarios. Hice esto programáticamente y fue, por supuesto, terriblemente lento. Lo mejor que pude averiguar para hacerlo en SQL fue unir sub-selecciones, que también fueron lentas y tuve que hacer una para cada código.


En realidad, esto no es tan difícil de hacer en PostgreSQL porque tiene la cláusula "DISTINCT ON" en su sintaxis SELECT (DISTINCT ON no es SQL estándar).

SELECT DISTINCT ON (code) code, content, createtime FROM metatable WHERE userid = 15 ORDER BY code, createtime DESC;

Eso limitará los resultados devueltos al primer resultado por código único, y si ordena los resultados por el tiempo de creación descendente, obtendrá los más nuevos de cada uno.


Una subselección es la forma estándar de hacer este tipo de cosas. Solo necesita una Restricción única en la Id. De usuario, Código y Fecha, y luego puede ejecutar lo siguiente:

SELECT * FROM Table JOIN ( SELECT UserId, Code, MAX(Date) as LastDate FROM Table GROUP BY UserId, Code ) as Latest ON Table.UserId = Latest.UserId AND Table.Code = Latest.Code AND Table.Date = Latest.Date WHERE UserId = @userId