Sql server 用于根据多个条件拾取随机样本的SQL存储过程
我是SQL新手。我在互联网上到处寻找与我遇到的问题相匹配的解决方案,但我没有找到任何解决方案。我在SQL server 2012中有一个名为“tblItemReviewItems”的表。 资料: 1.ItemReviewId列是主键。 2.删除的列将只有“是”和“否”值。 3.“已审核”列将只有“是”和“否”值 我想创建一个存储过程来执行以下操作: 从给定日期范围内不同的“UserId”和“ReviewDate”的所有ItemReviewId中随机抽取10%的样本。10%的样本应包括删除的否中总人口的-5%和删除的是中总人口的5%。已审核=是将从样本中排除。 例如,一个用户有118条记录。在118条记录中,17条记录删除了列值“否”,101条记录删除了列值“是”。我们需要从12条记录中随机抽取样本。在这12条记录中,6条应删除列值“否”,6条应删除列值“是” 更新已审核列值以检查拾取的样本。 我怎样才能做到这一点 这是我用来选取5%已删除列值No和5%已删除列值Yes的样本的存储过程。现在情况不同了Sql server 用于根据多个条件拾取随机样本的SQL存储过程,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我是SQL新手。我在互联网上到处寻找与我遇到的问题相匹配的解决方案,但我没有找到任何解决方案。我在SQL server 2012中有一个名为“tblItemReviewItems”的表。 资料: 1.ItemReviewId列是主键。 2.删除的列将只有“是”和“否”值。 3.“已审核”列将只有“是”和“否”值 我想创建一个存储过程来执行以下操作: 从给定日期范围内不同的“UserId”和“ReviewDate”的所有ItemReviewId中随机抽取10%的样本。10%的样本应包括删除的否中
ALTER PROC [dbo].[spItemReviewQcPickSample]
(
@StartDate Datetime
,@EndDate Datetime
)
AS
BEGIN
WITH CTE
AS (SELECT ItemReviewId
,100.0
*row_number() OVER(PARTITION BY UserId
,ReviewDate
,Deleted
order by newid()
)
/count(*) OVER(PARTITION BY UserId
,Reviewdate
,Deleted
)
AS pct
FROM tblItemReviewItems
WHERE ReviewDate BETWEEN @StartDate AND @EndDate
AND Deleted in ('Yes','No')
AND Audited='No'
)
SELECT a.*
FROM tblItemReviewItems AS a
INNER JOIN cte AS b
ON b.ItemReviewId=a.ItemReviewId
AND b.pct<=6
;
WITH CTE
AS (SELECT ItemReviewId
,100.00
*row_number() OVER(PARTITION BY UserId
,ReviewDate
,Deleted
ORDER BY newid()
)
/COUNT(*) OVER(PARTITION BY UserId
,Reviewdate
,Deleted
)
AS pct
FROM tblItemReviewItems
WHERE ReviewDate BETWEEN @StartDate AND @EndDate
AND deleted IN ('Yes','No')
AND audited='No'
)
UPDATE a
SET Audited='Check'
FROM tblItemReviewItems AS a
INNER JOIN cte AS b
ON b.ItemReviewId=a.ItemReviewId
AND b.pct<=6
;
END
任何帮助都将不胜感激。提前感谢。这可能有助于您开始学习。我的想法是,创建所需的临时表,并将特定数据加载到已删除、未删除等。。然后,您可以按照以下方式运行某些内容:
IF OBJECT_ID('tempdb..#tmpTest') IS NOT NULL DROP TABLE #tmpTest
GO
CREATE TABLE #tmpTest
(
ID INT ,
Random_Order INT
)
INSERT INTO #tmpTest
(
ID
)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9 UNION ALL
SELECT 10 UNION ALL
SELECT 11 UNION ALL
SELECT 12 UNION ALL
SELECT 13 UNION ALL
SELECT 14 UNION ALL
SELECT 15 UNION ALL
SELECT 16;
DECLARE @intMinID INT ,
@intMaxID INT;
SELECT @intMinID = MIN(ID)
FROM #tmpTest;
SELECT @intMaxID = MAX(ID)
FROM #tmpTest;
WHILE @intMinID <= @intMaxID
BEGIN
UPDATE #tmpTest
SET Random_Order = 10 + CONVERT(INT, (30-10+1)*RAND())
WHERE ID = @intMinID;
SELECT @intMinID = @intMinID + 1;
END
SELECT TOP 5 *
FROM #tmpTest
ORDER BY Random_Order;
这将为列指定一个随机数,然后与TOP 5子句一起使用,以获得随机的TOP 5选择
一个循环可能效率不高,但是你可以在没有它的情况下更新为一个随机数,同样的原理也可以实现。希望这能给你一些想法