首页 > 解决方案 > 将产品随机分配给交易

问题描述

表:交易

ID Date  
1  11-01 
2  11-01 
3  11-02 
4  11-10 
5  11-12 

表:产品

ID  Name 
100 ABC  
101 CDE  
102 DEF  

结果

ID Date  Product
1  11-01 100
2  11-01 101
3  11-02 102
4  11-10 101
5  11-12 102

标签: sqlsql-serverazure-sql-database

解决方案


您可以使用内联查询:

select 
    t.id,
    t.date,
    (select top 1 id from product order by newid()) product
from transaction t

top 1带有and的内联子查询order by newid()为您提供表中的随机记录product


编辑

上面的查询似乎没有产生足够的熵。可能,SQLServer 优化了查询并且只运行一次内联查询。

以下似乎有效:

select id, date, product
from (
    select 
        t.id,
        t.date,
        p.id product,
        row_number() over(partition by t.id, t.date order by newid()) rn
    from Transaction t
    cross join Product p
) t
where rn = 1

这通过在表之间生成笛卡尔积,为每个给定的每个产品分配一个随机排名(id, date),然后过滤每个组的顶部记录。

DB Fiddle 上的演示

编号 | 日期 | 产品
-: | :---- | ------:
 1 | 11-01 | 100
 2 | 11-01 | 101
 3 | 11-02 | 100
 4 | 11-10 | 102
 5 | 11-12 | 101

注意:transaction是SQL中的保留作品;不要在现实生活中将其用作表名......


推荐阅读