我有一个tableA,它包含一个id、一个weight(int)和其他类别字段,我必须过滤它们。权重越低,被复制到表B的概率越高。
我必须复制一定数量的行(125),并且必须确保表B中满足某些条件:
- 至少5行
fieldA = 'value1' and fieldB = 'value10'
- 至少5行
fieldA = 'value1' and fieldB = 'value11'
- 至少1行
fieldA = 'value2'
- 还有其他大致相同的条件。
选择行并不是一个真正的问题:
insert into tableB (id, weight, fieldA, fieldB)
select id, weight, fieldA, fieldB
from tableA
where
(fieldA = 'value1' and fieldB = 'value10')
or (fieldA = 'value1' and fieldB = 'value11')
or (fieldA = 'value2')
order by random() * weight
字符串
但是,由于表B中填充的是“随机”值,我如何确保满足最低条件?我需要在一个循环中这样做吗?我猜是的:插入一行、检查条件,然后插入另一行、检查条件,依此类推。以前没有在SQL中做过循环,希望有一些指导。
谢谢你,谢谢
1条答案
按热度按时间6l7fqoea1#
ROW_NUMBER
加上一些额外的逻辑是你的朋友。这里的前景
fieldA = 'value1' and fieldB = 'value10'
)a uniquethread_id
weight
定义row_number
-即partition by thread_id order by weight desc
个row_number
(例如5为上面的线程)row_number
的行,并按降序weight
-order by rn nulls last, weight desc
选择限制的其他行当然,只有当表具有每个线程所需的最小行数,并且最小行数的总和小于您的总体限制时,它才能工作。
查询
字符串
样本数据
型
结果
型