Oracle聚合函数返回一组随机值?

发布于 2024-09-06 06:30:37 字数 617 浏览 5 评论 0原文

标准 SQL 聚合函数 max() 将返回组中的最高值; min() 将返回最低值。

Oracle中是否有聚合函数可以从组中返回随机值?或者某种技术来实现这一目标?

例如,给定表 foo

group_id value
1        1
1        5
1        9
2        2
2        4
2        8

SQL 查询

select group_id, max(value), min(value), some_aggregate_random_func(value)
from foo
group by group_id;

可能会生成:

group_id  max(value), min(value), some_aggregate_random_func(value)
1        9            1           1
2        8            2           4

显然,最后一列是该组中的任何随机值。

The standard SQL aggregate function max() will return the highest value in a group; min() will return the lowest.

Is there an aggregate function in Oracle to return a random value from a group? Or some technique to achieve this?

E.g., given the table foo:

group_id value
1        1
1        5
1        9
2        2
2        4
2        8

The SQL query

select group_id, max(value), min(value), some_aggregate_random_func(value)
from foo
group by group_id;

might produce:

group_id  max(value), min(value), some_aggregate_random_func(value)
1        9            1           1
2        8            2           4

with, obviously, the last column being any random value in that group.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

三月梨花 2024-09-13 06:30:37

您可以尝试类似以下的方法。

select deptno,max(sal),min(sal),max(rand_sal) 
from(
select deptno,sal,first_value(sal) 
     over(partition by deptno order by dbms_random.value) rand_sal
from emp)
group by deptno
/

想法是按随机顺序对组内的值进行排序并选择第一个。我可以想到其他方法,但没有那么有效。

You can try something like the following

select deptno,max(sal),min(sal),max(rand_sal) 
from(
select deptno,sal,first_value(sal) 
     over(partition by deptno order by dbms_random.value) rand_sal
from emp)
group by deptno
/

The idea is to sort the values within group in random order and pick the first.I can think of other ways but none so efficient.

夜吻♂芭芘 2024-09-13 06:30:37

您可以在要从中提取随机元素的列前面添加一个随机字符串,然后选择该列的 min() 元素并取出前面添加的字符串。

select group_id, max(value), min(value), substr(min(random_value),11)
from (select dbms_random.string('A', 10)||value random_value,foo.* from foo)

通过这种方式,您可以避免使用聚合函数并指定两次分组依据,这在查询非常复杂/或者您只是探索数据并手动输入带有冗长且不断变化的列表的查询的情况下可能很有用。按列分组。

You might prepend a random string to the column you want to extract the random element from, and then select the min() element of the column and take out the prepended string.

select group_id, max(value), min(value), substr(min(random_value),11)
from (select dbms_random.string('A', 10)||value random_value,foo.* from foo)

In this way you cand avoid using the aggregate function and specifying twice the group by, which might be useful in a scenario where your query is very complicated / or you are just exploring the data and are entering manually queries with a lengthy and changing list of group by columns.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文