【发布时间】:2017-07-24 20:41:59
【问题描述】:
我在 Oracle 中有一个表,我想在应用某些条件后获得 10% 的样本记录。我在 Google 中进行了搜索,但我没有得到正确的算法来在 Oracle 中的 WHERE 子句之后使用 SAMPLE 子句。
我用下面的例子解释了我的要求。你能建议如何编写sql查询吗?我的尝试不起作用。
餐桌名称:住宿
表格记录:
ACCOM_ID ACCOM_TYPE
-------- ----------
1 HOTEL
2 HOTEL
3 HOTEL
4 HOTEL
5 HOUSE
6 HOUSE
7 CRUISE
在这里,我想在应用条件后获得 50% 的样本记录。也就是说,
SELECT * FROM (SELECT * FROM ACCOMMODATION WHERE ACCOM_TYPE = 'HOTEL') T SAMPLE(50);
或
SELECT * FROM (SELECT * FROM ACCOMMODATION WHERE ACCOM_TYPE = 'HOUSE') T SAMPLE(50);
但上述查询不起作用,失败并出现错误 ORA-00933: SQL command not properly ended 。如果我像下面这样使用,它不会正确地将结果返回给我。我只想要 2 个随机酒店记录,但它有时会返回 2,有时会返回 3,有时会返回 4。
select * from accommodation sample(50) where accom_type = 'HOTEL';
请参考 sql fiddle 示例HERE。
编辑:这是示例表。我使用的真实表有很多记录,所以很遗憾我无法order by dbms_random.value(),因为它需要很长时间才能完成。
【问题讨论】:
-
如果我理解您的要求;您想以任何方式随机获取 50% 的记录吗?如果您有 6 条记录,您希望随机显示 3 条记录吗?
-
我想要 50% 的记录在应用条件之后。例如:50% 的酒店住宿,50% 的住宿。