如何为所有 3 个项目都存在于选择中的 3 个项目选择 10 个随机记录
Posted
技术标签:
【中文标题】如何为所有 3 个项目都存在于选择中的 3 个项目选择 10 个随机记录【英文标题】:how to select 10 random records for 3 items that all 3 items exist in the selection 【发布时间】:2013-08-29 14:46:39 【问题描述】:我正在与 Oracle 合作,但遇到了我不知道如何解决的问题。 我有很多商店,每家都卖 3 件商品。 我需要为每家商店的这 3 个项目中的每一个选择随机记录, 但每家商店的记录数量不得超过10条 并且每家商店必须至少出售每件商品。
我现在的选择为每个商店选择 10 条记录 但它选择了一项(通常是最后一项)
select *
FROM
(select store_id,item_id, product_name
row_number() over(partition by store_id order by item_id) as MyCount
from table5 order by dbms_random.value)
where MyCount<=10
如何让它为每个商店选择所有 3 个项目和
样本数据:
Id Store_ID Item_ID Product_ID
------------------------------
1 11723 13048841 2
2 11723 13332688 2
3 11723 08981562 4
4 11723 08872923 4
5 11723 01030632 5
6 11723 01029557 5
7 11723 01010174 5
8 11723 01031526 5
9 11723 01032479 5
10 11723 01000285 5
【问题讨论】:
我认为您应该将order by dbms_random.value
放入您的分区中,而不是 item_id。你能展示一些示例数据吗?
谢谢!它有点帮助。我现在在结果中有 2 个项目,而不是 1 个。它仍然没有选择所有 3 个。
其实你说的很对!那家店只卖2件。另一个选择具有所有 3 个值。非常感谢!
不幸的是,该代码不一定会选择所有 3 个项目,有时只会选择 2 个。我如何确保选择所有 3 个项目?
你能展示一些示例数据吗?或创建sqlfiddle
【参考方案1】:
可能不是真正随机的,但这可以确保所有三个项目都出现在结果中。够好吗?
SELECT id,
store_id,
item_id,
product_id
FROM (SELECT id,
store_id,
item_id,
product_id,
ROW_NUMBER ()
OVER (PARTITION BY store_id ORDER BY r1, DBMS_RANDOM.VALUE)
r2
FROM (SELECT id,
store_id,
item_id,
product_id,
ROW_NUMBER ()
OVER (PARTITION BY store_id, product_id
ORDER BY DBMS_RANDOM.VALUE)
r1
FROM mytab))
WHERE r2 <= 10;
sqlfiddle 上的演示。
【讨论】:
太完美了!非常感谢!以上是关于如何为所有 3 个项目都存在于选择中的 3 个项目选择 10 个随机记录的主要内容,如果未能解决你的问题,请参考以下文章