Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从oracle中的多行中的一列中选择一个随机数据_Oracle_Select_Random_Greatest N Per Group - Fatal编程技术网

从oracle中的多行中的一列中选择一个随机数据

从oracle中的多行中的一列中选择一个随机数据,oracle,select,random,greatest-n-per-group,Oracle,Select,Random,Greatest N Per Group,我创建的视图只需要为每个客户选择一个随机行。比如: select c.name, p.number from customers c, phone_numbers p where p.customer_id = c.id NAME NUMBER --------- ------ Customer1 1 Customer2 4 Customer3 6 如果此查询返回: NAME NUMBER --------- ------ Customer1 1 Customer1 2

我创建的视图只需要为每个客户选择一个随机行。比如:

select c.name, p.number
from customers c, phone_numbers p
where p.customer_id = c.id
NAME      NUMBER
--------- ------
Customer1 1
Customer2 4
Customer3 6
如果此查询返回:

NAME      NUMBER
--------- ------
Customer1 1
Customer1 2
Customer1 3
Customer2 4
Customer2 5
Customer3 6
我需要它是这样的:

select c.name, p.number
from customers c, phone_numbers p
where p.customer_id = c.id
NAME      NUMBER
--------- ------
Customer1 1
Customer2 4
Customer3 6
Rownum不起作用,因为它只会从所有6条记录中选择第一条,我需要每个客户的第一条记录。我需要的解决方案不会对性能产生太大影响,因为选择数据的查询非常复杂,这只是一个解释我需要什么的示例。提前感谢。

使用
行号()
分析功能:

SELECT name,
       number
FROM   (
  SELECT c.name,
         p.number,
         ROW_NUMBER() OVER ( PARTITION BY c.id ORDER BY DBMS_RANDOM.VALUE ) AS rn
  FROM   customers c
         INNER JOIN phone_numbers p
         ON ( p.customer_id = c.id )
)
WHERE  rn = 1
使用
行编号()
分析功能:

SELECT name,
       number
FROM   (
  SELECT c.name,
         p.number,
         ROW_NUMBER() OVER ( PARTITION BY c.id ORDER BY DBMS_RANDOM.VALUE ) AS rn
  FROM   customers c
         INNER JOIN phone_numbers p
         ON ( p.customer_id = c.id )
)
WHERE  rn = 1

您可以使用group by子句仅返回一个电话号码:

select c.name, MAX(p.number) as phone
from customers c, phone_numbers p
where p.customer_id = c.id
group by c.name

您可以使用group by子句仅返回一个电话号码:

select c.name, MAX(p.number) as phone
from customers c, phone_numbers p
where p.customer_id = c.id
group by c.name

您还可以将最小或最大聚合函数用于:

number
不是有效的列名或别名,因为它是保留字,所以当然要使用您自己的真实姓名)

如果电话号码需要是任意的,而不是随机的,您可以通过其他方式订购:

select c.name,
  min(p.number) keep (dense_rank last order by null) as number
from customers c
join phone_numbers p on p.customer_id = c.id
group by c.id, c.name
order by c.name;
您可能每次都会为每个客户返回相同的数字,但并非总是如此,数据/统计数据/计划更改将影响您看到的数据。不过你好像不在乎。但是,使用普通聚合可能对您同样有效,就像@under的回答一样


如果您从该随机行中获得很多列,而不仅仅是电话号码,那么MTO的子查询可能会更简单;对于一个或两个值,我发现这一点更清楚。

您也可以将最小或最大聚合函数用于:

number
不是有效的列名或别名,因为它是保留字,所以当然要使用您自己的真实姓名)

如果电话号码需要是任意的,而不是随机的,您可以通过其他方式订购:

select c.name,
  min(p.number) keep (dense_rank last order by null) as number
from customers c
join phone_numbers p on p.customer_id = c.id
group by c.id, c.name
order by c.name;
您可能每次都会为每个客户返回相同的数字,但并非总是如此,数据/统计数据/计划更改将影响您看到的数据。不过你好像不在乎。但是,使用普通聚合可能对您同样有效,就像@under的回答一样


如果您从该随机行中获得很多列,而不仅仅是电话号码,那么MTO的子查询可能会更简单;对于一个或两个值,我发现这更清楚。

这将得到一个特定的行(最大值),而不是OP请求的随机行。你可以使用
MAX(p.number)KEEP(density_RANK FIRST ORDER BY DBMS_RANDOM.VALUE)
来代替。我认为“RANDOM”的意思是“任何”,因为后来他说“我需要每个客户的第一个”。这不重要,它必须至少显示一个数字,不管是哪个:)这就是我理解的,因此,MAX将是最简单、性能最好的解决方案……这将得到一个特定的行(最大值),而不是OP请求的随机行。你可以使用
MAX(p.number)KEEP(density_RANK FIRST ORDER BY DBMS_RANDOM.VALUE)
来代替。我认为“RANDOM”的意思是“任何”,因为后来他说“我需要每个客户的第一个”。这不重要,它必须至少显示一个数字,不管是哪个:)这就是我理解的,所以MAX将是最简单、性能最好的解决方案…谢谢,这很有效。即使在我的例子中性能受到很大影响,我相信我可以优化查询。@Paul如果您只需要一行,那么您可以使用
orderbyrownum
,而不是使用
DBMS\u RANDOM.VALUE
-这可能会加快查询速度,但它(可能)不会是随机的。谢谢,这很有效。即使在我的例子中性能受到很大影响,我相信我可以优化查询。@Paul如果你只需要一行,那么你可以使用
orderbyrownum
,而不是使用
DBMS\u RANDOM.VALUE
-这可能会加快查询速度,但它(可能)不是随机的。你真的是说“随机”吗,或者“任何”-如果您每次查询视图时为客户提供相同的号码,这有关系吗?获取任意行要比随机行快,因为您可以避免调用
dbms\u random
。任何人都可以。它必须是一个数字,不管客户有1个还是1000个,不管是哪一个。你是说“随机”还是“任意”——每次查询视图时,客户可能会得到相同的数字,这有关系吗?获取任意行要比随机行快,因为您可以避免调用
dbms\u random
。任何人都可以。它必须是一个数字,不管客户有1个还是1000个,不管是哪一个。