在SQL Server上为每个类别随机选择10%的行

u5rb5r59  于 2023-01-25  发布在  SQL Server
关注(0)|答案(1)|浏览(200)

有一张销售产品的表格。
| 行标识|顾客|积|销售日期|
| - ------|- ------|- ------|- ------|
| 1个|客户_1|辛加吉格|二○二三年一月一日|
| 第二章|客户_12|沃西沃西|二○二三年一月三日|
| 三个|客户_1|沃查马卡利特|二零二三年一月四日|
| 四个|客户_4|沃西沃西|二○二三年一月六日|
| ...|...|...|...|
每个项目始终占一行。
假设customer_1总共订购了100个项目。customer_2总共订购了50个项目。customer_3总共订购了17个项目。**如何为每个客户随机选择10%的行?**所选行的分数应向上舍入(例如,总共12行结果中选择了2行)。这意味着至少购买了一个项目的每个客户都应该出现在结果表中。在这种情况下,customer_1customer_2customer_3的结果表将具有10 + 5 + 2 = 17行。
我最初的方法是创建一个临时表,为每个客户计算所需的行数,然后循环遍历临时表,为每个客户选择行,然后将它们插入到另一个表中,并从该表中进行选择:

drop table if exists #row_counts

select
    customer
    ceiling(convert(decimal(10, 2), count(product)) / 10) as row_count
into #row_counts
from products_sold
group by customer

-- then use cursor to loop over #row_counts and insert into the final table
-- for randomness an 'order by newid()' will be used

但这不是个好办法...

qojgxg4l

qojgxg4l1#

你需要知道你想要的东西的总数和行数。类似下面这样的东西可能会有用:
由于未正确随机化而编辑:

select *
from ( 
   select row_number() over(partition by customerid order by  newid()) as sortOrder
   , COUNT(*) OVER(PARTITION BY customerID) AS cnt
   , *
   FROM products
 ) p
-- Now, we want 10% of total count rounded upwards
WHERE sortOrder <= CEILING(cnt * 0.1)

相关问题