我想在一个查询中返回每个部分的前10条记录。有人能帮我做吗?Section是表中的列之一。
数据库为SQL Server 2005。我想按输入的日期返回前10名。部分包括业务、本地和特性。对于一个特定的日期,我只想要顶部(10)业务行(最近的条目)、顶部(10)本地行和顶部(10)特性。
我想在一个查询中返回每个部分的前10条记录。有人能帮我做吗?Section是表中的列之一。
数据库为SQL Server 2005。我想按输入的日期返回前10名。部分包括业务、本地和特性。对于一个特定的日期,我只想要顶部(10)业务行(最近的条目)、顶部(10)本地行和顶部(10)特性。
当前回答
在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
其他回答
尝试了下面的方法,它也适用于领带。
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
如果你正在使用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行,Matt的解决方案可能更适合你。
UNION操作符对您有用吗?每个部分有一个SELECT,然后将它们联合在一起。不过,我猜它只适用于固定数量的部分。
这适用于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 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实现要求选择列表中不属于聚合表达式的所有列也在GROUP BY中。