2011-01-11 20 views
6

Tengo una tabla que tiene este aspecto: comment_id, user_id, comentario, LAST_UPDATED.¿Cómo obtengo los últimos 5 comentarios (consulta SQL para SQL Server) para cada usuario?

Comment_id es una clave aquí. Cada usuario puede tener múltiples comentarios.

¿Cómo llego 5 comentarios (consulta SQL para SQL Server) para cada usuario?

de salida debe ser similar a la tabla original, simplemente limitar los comentarios de los usuarios a 5 más reciente para cada usuario.

Respuesta

10

Suponiendo al menos SQL Server 2005 para que pueda utilizar la función de ventana (row_number) y el CTE:

;with cteRowNumber as (
    select comment_id, user_id, comment, last_updated, ROW_NUMBER() over (partition by user_id order by last_updated desc) as RowNum 
     from comments 
) 
select comment_id, user_id, comment, last_updated 
    from cteRowNumber 
    where RowNum <= 5 
    order by user_id, last_updated desc 
+0

Gracias. Creo que esto funciona bien ¿Se puede hacer sin ROW_NUMBER(), solo con sintaxis SQL estándar? – myforums

+0

Puede reemplazar From cteRowNumber con la instrucción select. – JeffO

+2

@myforums: ¡esta sintaxis ANSI SQL estándar de ** IS **! –

0
SELECT TOP 5 * FROM table WHERE user_id = x ORDER BY comment_id ASC 

creo que debería hacerlo.

+0

Me dará los últimos comentarios para 1 usuario solamente, ¿no? Necesito 5 últimos comentarios para CADA usuario. – myforums

+0

"para cada usuario" probablemente signifique que quiere datos para * todos * usuarios a la vez, no solo para un usuario. – dkarp

+0

no devolverá los 5 comentarios más antiguos (ASC) de ** un usuario **? ¿No deberías usar la marca de tiempo DESC? – Nishant

0

En SqlServer 2005, límite no es válido.

En su lugar, hacer algo como:

SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY comment_id ASC 

Tenga en cuenta que esto supone que comment_id aumenta monotónicamente, que no siempre puede ser una suposición válida para los campos de identidad (si es que tienen que ser renumerado por ejemplo). Es posible que desee considerar un campo alternativo, pero la estructura básica sería la misma.

Tenga en cuenta que si se solicita por un campo de fecha, que se quiere ordenar en orden descendente en vez de orden ascendente, por ejemplo,

SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY last_updated DESC 
+0

"para cada usuario" probablemente significa que quiere datos para * todos * usuarios a la vez, no solo para un usuario. – dkarp

2

respuesta de Joe es la mejor manera de hacer esto en SQL Server (por lo menos, supongo que es, no estoy familiarizado con las CTE). Pero aquí hay una solución (¡no muy rápido!) Usando SQL estándar:

SELECT * FROM comments c1 
    WHERE (SELECT COUNT(*) FROM comments c2 
      WHERE c2.user_id = c1.user_id AND c2.last_updated >= c1.updated) <= 5 
+0

Gracias por esta solución también. – myforums

Cuestiones relacionadas