小编Mat*_*ker的帖子

SQL公平地选择随机组合的行

这是我的问题:我在数据库中有一组表,其中填充了来自包含产品信息的客户端的数据。除了基本的产品信息,还有关于制造商的信息,以及这些产品的类别(一个产品可以是一个或多个类别)。这些类别然后被称为“产品类别”,这些产品在哪些商店可用。这些表每周根据客户的提要更新一次。

由于出于我们的目的,某些产品类别与我们的目的相同或密切相关,因此还有另一种级别的类别称为“一般类别”,一般类别可以包含一个或多个产品类别。

对于这些表的范围,这里有一些粗略的数字:

Data Tables:
Products:           475,000
Manufacturers:      1300
Stores:             150
General Categories: 245
Product Categories: 500

Mapping Tables:
Product Category -> Product: 655,000
Stores -> Products:          50,000,000
Run Code Online (Sandbox Code Playgroud)

现在,对于实际问题:作为我们软件的一部分,我们需要选择n随机产品,给定商店和一般类别。但是,我们还需要确保制造商的良好组合,因为在某些类别中,单个制造商主导了结果,随机选择行会导致结果强烈偏向该制造商。

当前采用的解决方案适用于大多数情况,包括选择与商店和类别标准匹配的所有行,按制造商对它们进行分区,并在其分区中包含它们的行号,然后从中选择行号为该制造商小于n,并用于ROWCOUNT钳制返回到 的总行数n

这个查询看起来像这样:

SET ROWCOUNT 6
select p.Id, GeneralCategory_Id, Product_Id, ISNULL(m.DisplayName, m.Name) AS Vendor, 
       MSRP, MemberPrice, FamilyImageName 
    from (select p.Id, gc.Id GeneralCategory_Id, 
            p.Id Product_Id, ctp.Store_id, Manufacturer_id, 
            ROW_NUMBER() OVER (PARTITION BY Manufacturer_id ORDER BY NEWID()) AS 'VendorOrder', 
            MSRP, MemberPrice, FamilyImageName
            from GeneralCategory gc
                inner …
Run Code Online (Sandbox Code Playgroud)

sql-server

5
推荐指数
1
解决办法
1462
查看次数

标签 统计

sql-server ×1