为每个类别select前10个logging

我想在一个查询中返回每个部分的前10条logging。 任何人都可以帮助如何做到这一点? 部分是表格中的一列。

数据库是SQL Server 2005.我想按input的date返回前10名。 部分是业务,本地和function。 对于某个特定的date,我只需要顶部(10)业务行(最近的条目),顶部(10)本地行和顶部(10)function。

如果你正在使用SQL 2005,你可以做这样的事情…

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 

如果你的RankCriteria有联系,那么你可能会返回超过10行,马特的解决scheme可能会更好。

在T-SQL中,我会这样做:

 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 

这适用于SQL Server 2005(编辑,以反映您的澄清):

 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 
 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 

我这样做:

 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; 

更新: GROUP BY的这个例子只适用于MySQL和SQLite,因为这些数据库比GROUP BY的标准SQL更宽松。 大多数SQL实现要求select列表中不属于聚合expression式的所有列也都在GROUP BY中。

如果你知道这些部分是什么,你可以这样做:

 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 

我知道这个线程是有点老,但我碰到类似的问题(select每个类别的最新文章),这是我想出的解决scheme:

 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 

这与Darrel的解决scheme非常相似,但克服了RANK问题,可能会返回比预期更多的行。

如果我们使用SQL Server> = 2005,那么我们可以只用一个select来解决任务:

 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每个部分,然后联合在一起。 猜猜它只会对固定数量的部分有效。

Q)从每个组中findTOP Xlogging(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 

select6行。


如果要生成按部分分组的输出,则只显示每个部分的前n个logging,如下所示:

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

…那么以下应该适用于所有SQL数据库。 如果你想要前10名,只需将2改为10即可。

 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; 

build立:

 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'; 

你可以试试这个方法。 这个查询返回每个国家10个人口最多的城市。

  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; 

试过以下,它也与关系的工作。

 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