sql - 将产品随机分配给交易
问题描述
表:交易
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
解决方案
您可以使用内联查询:
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)
,然后过滤每个组的顶部记录。
编号 | 日期 | 产品 -: | :---- | ------: 1 | 11-01 | 100 2 | 11-01 | 101 3 | 11-02 | 100 4 | 11-10 | 102 5 | 11-12 | 101
注意:transaction
是SQL中的保留作品;不要在现实生活中将其用作表名......
推荐阅读
- node.js - 节点 js 中的最大行数:child-process.exec
- python - 在 python 中采购 bash 文件并在同一脚本中使用环境变量
- jasper-reports - 带有手动标记的 pdf 报告抛出 EmptyStackException
- laravel - Laravel 的尝试()方法未定义(JWT)
- javascript - 选择一个值并形成一个数组对象
- flutter - 不支持的操作:不支持的平台:android - Flutter + Firebase Admin SDK
- javascript - Web 扩展的内容脚本是否在网页的主线程上运行?
- python - 在外部文件夹中被 jupyter 调用后,从同一文件夹导入
- tensorflow - 是否可以将 TFLite 配置为返回偏差量化为 int8 的模型?
- pm2 - 如何从 systemctl 停止 pm2 进程