通过report_id获取最高'n'条记录

时间:2010-05-31 22:03:21

标签: sql sql-server-2005 tsql

我在MSSQL数据库中有一个简单的视图。它由以下字段组成:

report_id INT
ym VARCHAR -- YYYY-MM
keyword VARCHAR(MAX)
visits INT

我可以使用以下查询轻松获得前10个关键字匹配:

SELECT TOP 10 *
FROM top_keywords
WHERE ym BETWEEN '2010-05' AND '2010-05'
ORDER BY visits DESC

现在它变得棘手的是我必须在给定的日期范围(report_id)中获得每个ym BETWEEN @start_date AND @end_date的前10条记录。

我如何获得每个report_id的前10名?我偶然发现了涉及使用ROW_NUMBER()和RANK()的建议,但是在实现方面却非常不成功。

3 个答案:

答案 0 :(得分:3)

怎么样

SELECT *
FROM (SELECT *,
         ROW_NUMBER() OVER(PARTITION BY report_id ORDER BY (SELECT 0)) AS RN
         FROM top_keywords
         WHERE ym BETWEEN '2010-05' AND '2010-05') TK
WHERE RN <= 10

答案 1 :(得分:1)

未经测试(因为我家里没有安装mssql),但这应该是关闭的......

with IDs (ID) as (
  select
    report_id
  from
    top_keywords tk
  where
    tk.ym between @start_date and @end_date
    and row_number() over(partition by report_id order by visits desc) <= 10
)
  select
    top.*
  from
    top_keywords top
    join IDs on IDs.ID = top.report_id

答案 2 :(得分:0)

您想要进行单个查询还是一系列查询?对于一系列查询,您可以

  • 步骤1)查找所有唯一报告ID
  • 步骤2)使用上面的查询作为顶部 10为该报告

或者您真的想要一个可以提供所有结果的巨型查询吗?您想要多少结果,每个报告ID为10个?