【问题标题】:Efficiently selecting random duplicate entries in Oracle SQL在 Oracle SQL 中有效地选择随机重复条目
【发布时间】:2017-07-19 09:10:18
【问题描述】:

我有一个看起来像这样的数据集

   id   date
  250  01-JAN-15
  250  01-MAR-15
  360  01-JUN-15
  470  01-FEB-15
  470  01-DEC-15
  470  01-NOV-15
  780  01-APR-15
  790  01-SEP-15
  790  01-MAY-15

我想随机选择行,这样重复的ids 只会出现一次。例如:

   id   date
  250  01-MAR-15
  360  01-JUN-15
  470  01-FEB-15
  780  01-APR-15
  790  01-SEP-15

我目前的解决方案使用了一个分析函数,它需要很长时间才能在数亿行上运行:

select * from(
 select aa.*, row_number() over (partition by id order by dbms_random.value) as random_flag 
 from table aa)
where random_flag = 1

关于如何在没有分析函数的情况下获得相同结果的任何提示?

【问题讨论】:

  • 你可以在组中取 min() 或 Max() 值而不是随机的吗?
  • 不。它必须是随机的
  • 您要设置所有IDs 还是只设置一个子集?
  • 我需要所有IDs
  • 您目前正在做的事情似乎已经是最有效的方式了。你用这个干什么?也许为每个不同的 ID 选择随机行的想法并不是解决更高级别问题的唯一(或者甚至不是最好的)方法。

标签: sql database oracle oracle11g


【解决方案1】:

你可以试试这个查询:

SELECT id, (select t2.date from table t2 where t2.id = t1.id and rownum = 1)
FROM table t1
GROUP BY id;

【讨论】:

  • random 如何适应这个解决方案?如果没有特定的排序子句,则不能保证 ROWNUM,但这并不意味着它是随机的。
  • Oracle 检索记录的顺序不固定。因此我们无法预测查询的结果。 Rownum 仅用于限制要获取的记录数,在本例中为 1。
猜你喜欢
  • 2012-05-22
  • 2011-02-01
  • 2011-08-11
  • 2013-07-27
  • 1970-01-01
  • 2012-07-13
  • 2020-12-01
相关资源
最近更新 更多