Si tengo una tabla con los siguientes campos
ID, SomeFK, SomeTime
¿Cómo escribiría una consulta para devolver los últimos / mejores 3 elementos (basados en SomeTime
) para cada SomeFK
?
Entonces, el resultado puede parecerse
SomeFK Sometime 0 2012-07-05 0 2012-07-04 0 2012-07-03 1 2012-07-03 1 2012-07-02 1 2012-07-01 2 2012-07-03 2 2012-07-02 2 2012-07-01 ....etc....
Devolver los últimos artículos para un SomeFK
particular es fácil, pero simplemente no puedo pensar cómo hacerlo para lo anterior. ¡También siento que debería ser muy simple!
EDITAR:
Disculpas, me perdí un poco de información key. esto es para SQL2000, entonces ROW_NUMBER()
no se puede usar!
SELECT SomeFk, SomeTime FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY SomeFK ORDER BY sometime desc) rn FROM yourtable ) v WHERE rn<=3 ORDER BY somefk, rn
Para SQL 2000, recomiendo actualizar a una plataforma compatible.
Pero si insistes
select * from yourtable t1 where (select COUNT(*) from yourtable where somefk = t1.somefk and sometime>=t1.sometime ) <=3
Creo que te entendí correctamente, ¿no puedes seleccionar el max
SomeTime y luego agrupar, como este:
select SomeFK, max(SomeTime) from Table group by SomeFK
Podría estar fuera de lugar aquí, ya que no estoy del todo seguro de a qué te refieres con lo último.
Basado en este enlace (proporcionado como comentario a la pregunta original). Una solución es:
SELECT DISTINCT ID, SomeFK, SomeTime FROM SomeTable t1 WHERE ID IN (SELECT TOP 3 ID FROM SomeTable t2 WHERE t2.SomeFK= t1.SomeFK ORDER BY SomeTime DESC) ORDER BY SomeFK, SomeTime DESC
Aunque prefiero la solución aceptada ahora.