Sql server 用于根据多个条件拾取随机样本的SQL存储过程

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%的样本应包括删除的否中

我是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的样本的存储过程。现在情况不同了

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选择

一个循环可能效率不高,但是你可以在没有它的情况下更新为一个随机数,同样的原理也可以实现。希望这能给你一些想法