[英]Select random values from each group, SQL
我有一個項目,通過它我可以創建一個由數據庫驅動的游戲。
數據庫輸入的數據如下:
(身份證,姓名)|| (1,PhotoID),(1,PhotoID),(1,PhotoID),(2,PhotoID),(2,PhotoID)等。 有數以千計的條目。
這是我當前的SQL語句:
$sql = "SELECT TOP 8 * FROM Image WHERE Hidden = '0' ORDER BY NEWID()";
但是這也可以產生具有匹配ID的結果,其中我需要使每個結果具有唯一ID(即我需要來自每個組的一個結果)。
如何更改查詢以從每個組中獲取一個結果?
謝謝!
由於ORDER BY NEWID()
無論如何都會導致表掃描,因此您可以使用row_number()來隔離組中的第一個:
; with randomizer as (
select id,
name,
row_number() over (partition by id
order by newid()) rn
from Image
where hidden = 0
)
select top 8
id,
name
from randomizer
where rn = 1
-- Added by mellamokb's suggestion to allow groups to be randomized
order by newid()
由於mellamokb, Sql Fiddle游樂場 。
如果您在ID
列上有索引並希望利用索引並避免全表掃描,請首先對鍵值進行隨機化:
WITH IDs AS
(
SELECT DISTINCT ID
FROM Image
WHERE Hidden = '0'
),
SequencedIDs AS
(
SELECT ID, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Seq
FROM IDs
),
ImageGroups AS
(
SELECT i.*, ROW_NUMBER() OVER (PARTITION BY i.ID ORDER BY NEWID()) Seq
FROM SequencedIDs s
INNER JOIN Image i
ON i.ID = s.ID
WHERE s.Seq < 8
AND i.Hidden = '0'
)
SELECT *
FROM ImageGroups
WHERE Seq = 1
這應該大大降低了表掃描方法的成本,雖然我沒有足夠大的模式可以測試 - 所以嘗試在SSMS中運行一些統計信息並確保ID
實際上被索引以使其有效。
select * from (select * from photos order by rand()) as _SUB group by _SUB.id;
select ID, Name from (select ID, Name, row_number() over
(partition by ID, Name order by ID) as ranker from Image where Hidden = 0 ) Z where ranker = 1
order by newID()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.