每组代码从表中选择n个随机行

时间:2019-07-24 14:22:45

标签: sql-server random

我有一张桌子,里面满是来自保险单或报价的客户详细信息。每个代码都分配有一个与营销活动相关的输出代码,每个代码发生4次,每个“批次”一个代码,仅代表一个月中的一周。我需要从每个批处理代码(1-4)的每个代码中随机选择25%的行,以放入另一个表中,这样我就可以保留这些行并防止将客户推向市场。

到目前为止,我在堆栈上看到的所有解决方案均指示如何使用初始CTE查询中的ROW_NUMBER对每个组中特定数量的行执行此操作,然后从中选择rn <=给定数字。我需要这样做,但是请选择每个组的25%。

我已经尝试过这种解决方案,但是特定的行号并没有使我前进;

Select N random rows in group

使用链接的解决方案,这就是我的代码当前没有完整的where子句的原因,因为我知道这不是我所需要的。

;WITH AttributionOutput AS (
SELECT [Output Code], BatchNo, MonthandYear
FROM [dbo].[Direct_Marketing_UK]
WHERE MonthandYear = 'Sep2019'
And [Output Code] NOT IN ('HOMELIVE','HOMELIVENB','HOMENBLE')
GROUP BY [Output Code], BatchNo, MonthandYear
HAVING COUNT(*) >= 60
)

, CodeandBatch AS (
SELECT  dmuk.PK_ID,
    dmuk.MonthandYear,
    dmuk.PackNo,
    dmuk.BatchNo,
    dmuk.CustomerKey,
    dmuk.URN,
    dmuk.[Output Code],
    dmuk.[Quote/Renewal Date],
    dmuk.[Name],
    dmuk.[Title],
    dmuk.[Initial],
    dmuk.[Forename],
    dmuk.[Surname],
    dmuk.[Salutation],
    dmuk.[Address 1],
    dmuk.[Address 2],
    dmuk.[Address 3],
    dmuk.[Address 4],
    dmuk.[Address 5],
    dmuk.[Address 6],
    dmuk.[PostCode],
    ROW_NUMBER() OVER(PARTITION BY dmuk.[Output Code], dmuk.BatchNo ORDER BY newid()) as rn
FROM [dbo].[Direct_Marketing_UK] dmuk INNER JOIN
 AttributionOutput ao ON dmuk.[Output Code] = ao.[Output Code]
                            AND dmuk.BatchNo = ao.BatchNo
                            AND dmuk.MonthandYear = ao.MonthandYear
)

SELECT URN,
   [Output Code],
   [BatchNo]
FROM CodeandBatch
WHERE rn <= 

我看不到ROW_NUMBER()如何帮助我从输出代码和批号的每种组合中获取25%的行。

1 个答案:

答案 0 :(得分:3)

我建议您看看NTILE。