我想在一个查询中返回每个部分的前10条记录。有人能帮我做吗?Section是表中的列之一。
数据库为SQL Server 2005。我想按输入的日期返回前10名。部分包括业务、本地和特性。对于一个特定的日期,我只想要顶部(10)业务行(最近的条目)、顶部(10)本地行和顶部(10)特性。
我想在一个查询中返回每个部分的前10条记录。有人能帮我做吗?Section是表中的列之一。
数据库为SQL Server 2005。我想按输入的日期返回前10名。部分包括业务、本地和特性。对于一个特定的日期,我只想要顶部(10)业务行(最近的条目)、顶部(10)本地行和顶部(10)特性。
当前回答
虽然这个问题是关于SQL Server 2005的,但大多数人已经继续前进了,如果他们确实发现了这个问题,在其他情况下首选的答案可能是使用CROSS APPLY,就像这篇博客文章中所说明的那样。
SELECT *
FROM t
CROSS APPLY (
SELECT TOP 10 u.*
FROM u
WHERE u.t_id = t.t_id
ORDER BY u.something DESC
) u
该查询涉及两个表。OP的查询只涉及1个表,在这种情况下,基于窗口函数的解决方案可能更有效。
其他回答
如果你知道这些部分是什么,你可以这样做:
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 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
您可以尝试这种方法。 这个查询为每个国家返回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;
虽然这个问题是关于SQL Server 2005的,但大多数人已经继续前进了,如果他们确实发现了这个问题,在其他情况下首选的答案可能是使用CROSS APPLY,就像这篇博客文章中所说明的那样。
SELECT *
FROM t
CROSS APPLY (
SELECT TOP 10 u.*
FROM u
WHERE u.t_id = t.t_id
ORDER BY u.something DESC
) u
该查询涉及两个表。OP的查询只涉及1个表,在这种情况下,基于窗口函数的解决方案可能更有效。
尝试了下面的方法,它也适用于领带。
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