我在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()的建议,但是在实现方面却非常不成功。
答案 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)
您想要进行单个查询还是一系列查询?对于一系列查询,您可以
或者您真的想要一个可以提供所有结果的巨型查询吗?您想要多少结果,每个报告ID为10个?