una ultimos solo seleccionar repetido registros registro primeros primer obtener mostrar los grupo consulta cada sql sql-server sql-server-2005 greatest-n-per-group

solo - seleccionar los ultimos 10 registros mysql



Seleccione los 10 registros principales para cada categoría (14)

¿Podría el operador de UNION trabajar para usted? Tenga un SELECT para cada sección, luego UNIONALOS juntos. Supongo que solo funcionaría para un número fijo de secciones.

Quiero devolver los 10 registros principales de cada sección en una consulta. ¿Alguien puede ayudar con cómo hacerlo? La sección es una de las columnas en la tabla.

La base de datos es SQL Server 2005. Quiero devolver los 10 primeros por fecha ingresada. Las secciones son de negocios, locales y funciones. Para una fecha en particular, solo deseo las primeras (10) filas de negocios (entrada más reciente), las mejores (10) filas locales y las principales (10).


En T-SQL, yo haría:

WITH TOPTEN AS ( SELECT *, ROW_NUMBER() over ( PARTITION BY [group_by_field] order by [prioritise_field] ) AS RowNo FROM [table_name] ) SELECT * FROM TOPTEN WHERE RowNo <= 10


Esto funciona en SQL Server 2005 (editado para reflejar su aclaración):

select * from Things t where t.ThingID in ( select top 10 ThingID from Things tt where tt.Section = t.Section and tt.ThingDate = @Date order by tt.DateEntered desc ) and t.ThingDate = @Date order by Section, DateEntered desc


Intenté lo siguiente y también funcionó con las ataduras.

SELECT rs.Field1,rs.Field2 FROM ( SELECT Field1,Field2, ROW_NUMBER() OVER (Partition BY Section ORDER BY RankCriteria DESC ) AS Rank FROM table ) rs WHERE Rank <= 10


Lo hago de esta manera:

SELECT a.* FROM articles AS a LEFT JOIN articles AS a2 ON a.section = a2.section AND a.article_date <= a2.article_date GROUP BY a.article_id HAVING COUNT(*) <= 10;

actualización: este ejemplo de GROUP BY funciona solo en MySQL y SQLite, porque esas bases de datos son más permisivas que SQL estándar con respecto a GROUP BY. La mayoría de las implementaciones SQL requieren que todas las columnas en la lista de selección que no son parte de una expresión agregada también estén en GROUP BY.


Puedes probar este enfoque. Esta consulta devuelve 10 ciudades más pobladas para cada país.

SELECT city, country, population FROM (SELECT city, country, population, @country_rank := IF(@current_country = country, @country_rank + 1, 1) AS country_rank, @current_country := country FROM cities ORDER BY country, population DESC ) ranked WHERE country_rank <= 10;


Q) Encontrar registros TOP X de cada grupo (Oracle)

SQL> select * from emp e 2 where e.empno in (select d.empno from emp d 3 where d.deptno=e.deptno and rownum<3) 4 order by deptno 5 ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7839 KING PRESIDENT 17-NOV-81 5000 10 7369 SMITH CLERK 7902 17-DEC-80 800 20 7566 JONES MANAGER 7839 02-APR-81 2975 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30

6 filas seleccionadas


Sé que este hilo es un poco viejo, pero acabo de tropezar con un problema similar (seleccione el artículo más nuevo de cada categoría) y esta es la solución que surgió:

WITH [TopCategoryArticles] AS ( SELECT [ArticleID], ROW_NUMBER() OVER ( PARTITION BY [ArticleCategoryID] ORDER BY [ArticleDate] DESC ) AS [Order] FROM [dbo].[Articles] ) SELECT [Articles].* FROM [TopCategoryArticles] LEFT JOIN [dbo].[Articles] ON [TopCategoryArticles].[ArticleID] = [Articles].[ArticleID] WHERE [TopCategoryArticles].[Order] = 1

Esto es muy similar a la solución de Darrel, pero supera el problema de RANK que podría devolver más filas de lo previsto.


Si bien la pregunta era sobre SQL Server 2005, la mayoría de las personas han avanzado y si encuentran esta pregunta, cuál podría ser la respuesta preferida en otras situaciones es una que use CROSS APPLY como se ilustra en esta publicación de blog .

SELECT * FROM t CROSS APPLY ( SELECT TOP 10 u.* FROM u WHERE u.t_id = t.t_id ORDER BY u.something DESC ) u

Esta consulta implica 2 tablas. La consulta del OP solo involucra 1 tabla, en caso de que una solución basada en función de ventana pueda ser más eficiente.


Si desea producir resultados agrupados por sección, mostrando solo los primeros n registros de cada sección, algo como esto:

SECTION SUBSECTION deer American Elk/Wapiti deer Chinese Water Deer dog Cocker Spaniel dog German Shephard horse Appaloosa horse Morgan

... entonces lo siguiente debería funcionar bastante genéricamente con todas las bases de datos SQL. Si quiere los 10 mejores, simplemente cambie los 2 a un 10 hacia el final de la consulta.

select x1.section , x1.subsection from example x1 where ( select count(*) from example x2 where x2.section = x1.section and x2.subsection <= x1.subsection ) <= 2 order by section, subsection;

Para configurar:

create table example ( id int, section varchar(25), subsection varchar(25) ); insert into example select 0, ''dog'', ''Labrador Retriever''; insert into example select 1, ''deer'', ''Whitetail''; insert into example select 2, ''horse'', ''Morgan''; insert into example select 3, ''horse'', ''Tarpan''; insert into example select 4, ''deer'', ''Row''; insert into example select 5, ''horse'', ''Appaloosa''; insert into example select 6, ''dog'', ''German Shephard''; insert into example select 7, ''horse'', ''Thoroughbred''; insert into example select 8, ''dog'', ''Mutt''; insert into example select 9, ''horse'', ''Welara Pony''; insert into example select 10, ''dog'', ''Cocker Spaniel''; insert into example select 11, ''deer'', ''American Elk/Wapiti''; insert into example select 12, ''horse'', ''Shetland Pony''; insert into example select 13, ''deer'', ''Chinese Water Deer''; insert into example select 14, ''deer'', ''Fallow'';


Si está utilizando SQL 2005, puede hacer algo como esto ...

SELECT rs.Field1,rs.Field2 FROM ( SELECT Field1,Field2, Rank() over (Partition BY Section ORDER BY RankCriteria DESC ) AS Rank FROM table ) rs WHERE Rank <= 10

Si su RankCriteria tiene vínculos, puede devolver más de 10 filas y la solución de Matt puede ser mejor para usted.


Si sabes cuáles son las secciones, puedes hacer:

select top 10 * from table where section=1 union select top 10 * from table where section=2 union select top 10 * from table where section=3


Si usamos SQL Server> = 2005, podemos resolver la tarea con una sola selección :

declare @t table ( Id int , Section int, Moment date ); insert into @t values ( 1 , 1 , ''2014-01-01''), ( 2 , 1 , ''2014-01-02''), ( 3 , 1 , ''2014-01-03''), ( 4 , 1 , ''2014-01-04''), ( 5 , 1 , ''2014-01-05''), ( 6 , 2 , ''2014-02-06''), ( 7 , 2 , ''2014-02-07''), ( 8 , 2 , ''2014-02-08''), ( 9 , 2 , ''2014-02-09''), ( 10 , 2 , ''2014-02-10''), ( 11 , 3 , ''2014-03-11''), ( 12 , 3 , ''2014-03-12''), ( 13 , 3 , ''2014-03-13''), ( 14 , 3 , ''2014-03-14''), ( 15 , 3 , ''2014-03-15''); -- TWO earliest records in each Section select top 1 with ties Id, Section, Moment from @t order by case when row_number() over(partition by Section order by Moment) <= 2 then 0 else 1 end; -- THREE earliest records in each Section select top 1 with ties Id, Section, Moment from @t order by case when row_number() over(partition by Section order by Moment) <= 3 then 0 else 1 end; -- three LATEST records in each Section select top 1 with ties Id, Section, Moment from @t order by case when row_number() over(partition by Section order by Moment desc) <= 3 then 0 else 1 end;


SELECT r.* FROM ( SELECT r.*, ROW_NUMBER() OVER(PARTITION BY r.[SectionID] ORDER BY r.[DateEntered] DESC) rn FROM [Records] r ) r WHERE r.rn <= 10 ORDER BY r.[DateEntered] DESC