Oracle 如何为3个项目选择10条随机记录,所有3个项目都存在于选择中

Oracle 如何为3个项目选择10条随机记录,所有3个项目都存在于选择中,oracle,random,Oracle,Random,我与Oracle合作,遇到了一个我不确定如何解决的问题。 我有很多商店,每一家都卖3种商品。 我需要从每个商店为这3种商品中的每一种选择随机记录, 但每个商店的记录数量不得超过10条 每家商店至少要出售一种商品 “选择我现在拥有”为每个存储选择10条记录 但它选择一个项目,通常是最后一个项目 select * FROM (select store_id,item_id, product_name row_number() over(partition by store_id order by i

我与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

可能不是真正随机的,但这确保了结果中存在所有三项。够好吗

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;

演示位于。

我认为您应该在partition by子句中按dbms\u random.value排序,而不是按item\u id排序。能否显示一些示例数据?谢谢!这有点帮助。结果中现在有2项,而不是1项。它仍然没有选择全部3个。事实上,你是绝对正确的!那家商店只卖两种商品。另一个选择具有全部3个值。谢谢!不幸的是,该代码不一定选择所有3项,有时只选择2项。我如何确保所有3个项目都被选中?您能展示一些示例数据吗?或者创造一个完美的世界!非常感谢你!
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;