使用以下查询来搜索标题中包含术语的产品。查询返回所需的结果(通常结果太多)。
现在我只希望它能够为每家公司选择最多3个(随机)产品。一些公司返回了许多记录/产品,但我只需要拿3个并继续下一个公司
SELECT p.title As entryname, cname
FROM company c, product p
WHERE p.title LIKE '%steel%' AND p.cid = c.cid
GROUP By cname, ca.title
我试图理解分区和排名的东西,但我没有走得太远。我正在使用ms sql
答案 0 :(得分:7)
您可以使用ROW_NUMBER()执行此操作
with cte as (
SELECT
p.title as entryname, cname,
ROW_NUMBER() OVER (PARTITION BY c.id ORDER BY p.id) rn
FROM company c
INNER JOIN product p
ON p.cid = c.cid
WHERE p.title LIKE '%steel%'
GROUP By cname, ca.title
)
SELECT
p.title as entryname, cname,
FROM CTE where rn <= 3
如果您真的想要随机(而不是具有最低ID的3),您可以将row_number行更改为
ROW_NUMBER() OVER (PARTITION BY c.id order by newid()) rn
答案 1 :(得分:0)
如果您的数据库是SQL Server(在帖子结尾处关闭ms sql),请查看TOP on MSDN:
SELECT TOP(3) p.title As entryname, cname
FROM company c, product p
WHERE p.title LIKE '%steel%' AND p.cid = c.cid
GROUP By cname, ca.title
对于Oracle,您可以在WHERE子句中使用rownum:
SELECT p.title As entryname, cname
FROM company c, product p
WHERE p.title LIKE '%steel%' AND p.cid = c.cid AND rownum < 4
GROUP By cname, ca.title
答案 2 :(得分:0)
你可以简单地追加
limit 3,5
到查询结尾。作为示例,这将从第3行开始为您提供顺序 5行。
现在选择这5行 randonly 是模式复杂的,我想。