タイプされた質問の表があります: Select One
, True False
,Select All
タイプの 1 つを返されるタイプの特定のパーセンテージに制限しながら、特定の数の質問を返すクエリを作成しようとしています。
例:
SELECT QuestionID, QuestionText, QuestionType
FROM Question
WHERE/HAVING --limit QuestionTypeID = 4 to be only 10% of total returned
私の最初の考えは、クエリを個別にプルすることでした
SELECT TOP 10 PERCENT QuestionID, QuestionText, QuestionType
FROM Question
WHERE QuestionTypeID <> 4
UNION ALL
SELECT QuestionID, QuestionText, QuestionType
FROM Question
WHERE QuestionTypeID = 4
ただし、これを計算するより効率的な方法がおそらくあるようです。
編集:
私が達成しようとしていることを明確にさせてください...他のタイプの質問の混合物を90%返し、タイプ4の10%のみを返す必要があります。
結果をランダム化する必要があるため、使用SET ROWCOUNT
してきましたORDER BY NEWID()
サブクエリを使用できますがSET ROWCOUNT
、サブクエリで使用する方法がわかりません...この時点では、一時テーブルが必要なようですが、より良い方法があれば教えてください...
私がこれまでに持っているもの...一時テーブル
DECLARE @ReturnPercent [int] --variable that holds percentage for bottom questions
DECLARE @ReturnCount [int] --variable that holds how many questions I'd like returned
CREATE TABLE #Temp1(
QuestionID [int],
QuestionText [nvarchar](256),
QuestionTypeID [int]
);
DECLARE @TOP [int] = @ReturnCount-CAST(@ReturnCount*@ReturnPercent AS INT);
DECLARE @BOTTOM [int] = CAST(@ReturnCount(@ReturnPercent AS INT);
SET ROWCOUNT @TOP
INSERT INTO #Temp1(QuestionID, QuestionText, QuestionTypeID)
SELECT QuestionID, QuestionText, QuestionTypeID
FROM Question
WHERE QuestionTypeID <> 4
ORDER BY NEWID()
SET ROWCOUNT 0
SET ROWCOUNT @BOTTOM
INSERT INTO #Temp1(QuestionID, QuestionText, QuestionTypeID)
SELECT QuestionID, QuestionText, QuestionTypeID
FROM Question
WHERE QuestionTypeID = 4
ORDER BY NEWID()
SET ROWCOUNT 0
--Query to join them with other data(omitted)
SET ROWCOUNT @ReturnCount
SELECT a.QuestionID, a.QuestionText, a.QuestionTypeID
FROM #Temp1 a
JOIN --OTHER TABLES FOR FULL QUERY
ORDER BY NEWID()
SET ROWCOUNT 0