2011-12-26 51 views
4

我們在其上存儲的每一個問題一個表(名爲試題庫)選擇隨機分區戰績:有記錄的指定數量在每個分區

Id  Topic  Hardness Position 
4  1   3   4 
5  1   2   1 
6  1   1   2 
7  1   3   3 
8  1   3   4 
9  2   2   1 
10  2   2   2 
11  2   3   3 
12  3   1   1 
13  3   1   1 
14  3   1   2 

每一個問題屬於一個主題,有它自己的硬度和位置(基於其內容的每個類似問題在相應主題上具有相同的位置)。

請注意,位置列中的值沒有意義,它只是在主題中劃分相似的問題。

目標是以隨機的方式選擇帶有Harness = 1的X記錄和Hardness = 2的Y記錄和Hardness = 3的Z記錄等的N個記錄;這個約束儘可能地沒有結果集中返回的具有相似主題和位置的記錄。

例如,Id = 4和Id = 8的記錄在主題和位置中都是相似的,因此希望其中的一個在結果集中。

回答

1

這是一種方法。

  1. 首先,如果有任何Topic, Position有多個問題分配給每個這些隨機排序RN1
  2. 然後按每個組隨機排序。顯然RN1的所有1值將首先排序,然後才能進入2,這表示特定Topic, Position組合的第二個問題。
  3. 然後使用由Hardness分區的ROW_NUMBER計算中的結果,使最終的SELECT更容易。

WITH T1 
    AS (SELECT *, 
       Row_number() OVER (PARTITION BY Topic, Position 
             ORDER BY Newid()) AS RN1 
     FROM QuestionBank), 
    T2 
    AS (SELECT *, 
       Row_number() OVER (ORDER BY RN1, Newid()) AS RN2 
     FROM T1), 
    T3 
    AS (SELECT *, 
       Row_number() OVER (PARTITION BY Hardness 
             ORDER BY RN2) AS RN3 
     FROM T2) 
SELECT Id, 
     Topic, 
     Hardness, 
     Position 
FROM T3 
WHERE (Hardness = 1 
     AND RN3 <= 3) 
     OR (Hardness = 2 
      AND RN3 <= 2) 
     OR (Hardness = 3 
      AND RN3 <= 2) 
ORDER BY Topic, 
      Position, 
      Hardness 

如果您每次只選擇一小部分表格,可能會有更高效的方法。

+0

非常感謝你的解決方案@Martin。 我從昨天開始工作,它的工作完美。 – 2011-12-27 08:31:44

+0

現在我陷入另一個問題: 如果我打算限制與話題相關的記錄數量而不是硬度。解決方案是什麼? 例如Topic = 1的3個記錄,Topic = 2的4個記錄和Topic = 3的2個記錄(而不是例如2個Hardness = 1的記錄,...) 預先感謝您的好意。 – 2011-12-27 08:47:10

0

您可以一個WHILE週期一次選擇一個問題。

要選擇隨機問題:

  1. 選擇硬度1的所有記錄到一個臨時表
  2. 使用rand()選擇其中一個
  3. 測試,如果有預先用同樣的選擇questin話題/位置,如果是這樣,則不必選擇所選問題並將其從第1點中選擇的問題中刪除。
  4. 執行步驟2至3,直到您具有指定的硬度的N個記錄
  5. 對其他硬度值執行步驟1至4。
相關問題