2012-04-19 117 views
3

我正在使用以下查詢來搜索標題中包含術語的產品。查詢返回所需的結果(通常結果太多)。每組選擇前x條記錄

現在我只希望它能夠爲每家公司選擇最多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

+2

你真的是指隨機而非隨意嗎?你的目標是什麼數據庫。這個問題的解決方案或DB特定的 – 2012-04-19 21:38:09

+0

Conrad,Am使用MS SQL web版。通過隨機,我的意思是前3個選定的產品不必是相同的所有...如果是100個產品的公司x,100中的任何3個可以做 – 2012-04-19 21:44:30

+0

好吧,因爲WEB版本直到2008年纔開始盡我所知,我已將標籤添加到您的問題 – 2012-04-19 21:48:26

回答

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 

如果你真的想隨機的(而不是3具有最低ID),您可以將ROW_NUMBER行更改爲

ROW_NUMBER() OVER (PARTITION BY c.id order by newid()) rn

0

如果你的數據庫是SQL服務器(在您的文章的末尾都會響起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,你會在哪裏使用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 
+0

OP要求每個公司的TOP 3產品。 – 2012-04-19 21:42:05

+0

DuraCell,這隻返回整個集合的TOP3。它應該爲每個公司返回1 2或最多3個產品 – 2012-04-19 21:52:07

0

你可以簡單地追加

limit 3,5 

到您的查詢的末尾。作爲一個例子,這會給你有序排列從第3行開始的5行。

現在選擇這5行randonly是模式複雜的東西,我猜。

+0

這是MySQL語法,事實證明是SQL Server。另外它的錯誤,運營商希望每個公司3個產品,而不是所有公司的3個,因此,添加限制3.5不會這樣做 – 2012-04-19 22:01:41

+0

@ConradFrix。是的,你是對的,這是錯的。下次我會兩次讀這個問題。謝謝! – 2012-04-19 22:08:59