ORDER BY在GROUP BY子句
我有一个查询ORDER BY在GROUP BY子句
Select
(SELECT id FROM xyz M WHEREM.ID=G.ID AND ROWNUM=1) TOTAL_X,
count(*) from mno G where col1='M' group by col2
从子查询
现在我要为这个取ramdom ID我做
Select
(SELECT id FROM xyz M WHEREM.ID=G.ID AND ROWNUM=1 order by dbms_random.value) TOTAL_X,
count(*) from mno G where col1='M' group by col2
但是,甲骨文显示错误
"Missing right parenthesis".
查询有什么问题,我该如何查询这个查询来获得随机ID。 请帮忙。
即使你所做的是合法的,它也不会给你想要的结果。 ROWNUM过滤器将在ORDER BY之前应用,因此您只需对一行进行排序。
你需要这样的东西。我不确定这个确切的代码是否能够在给定相关子查询的情况下工作,但基本的观点是,您需要有一个包含没有ROWNUM过滤器的ORDER BY的子查询,然后将ROWNUM过滤器上一层。
WITH subq AS (
SELECT id FROM xyz M WHERE M.ID=G.ID order by dbms_random.value
)
SELECT (SELECT id FROM subq WHERE rownum = 1) total_x,
count(*)
from mno g where col1='M' group by col2
您不能在子查询中使用顺序。它不会有问题也是如此,因为该行的编号是第一个应用,所以你无法通过使用顺序影响它,
[编辑]
尝试的解决方案。在这里没有Oracle,所以你必须阅读错别字。 在这种情况下,我生成一个随机值,获取每个mno.id中xyz记录的计数,并为每个mno.id的记录生成一个序列。
然后,一个更高的级别,我只筛选索引与随机值匹配的那些记录。 这应该给你一个随机的ID从xyz匹配的mno id。
select
x.mnoId,
x.TOTAL_X
from
(SELECT
g.id as mnoId,
m.id as TOTAL_X,
count(*) over (partition by g.id) as MCOUNT,
dense_rank() over (partition by g.id) as MINDEX,
r.RandomValue
from
mno g
inner join xyz m on m.id = g.id
cross join (select dbms_random.value as RandomValue from dual) r
where
g.col1 = 'M'
) x
where
x.MINDEX = 1 + trunc(x.MCOUNT * x.RandomValue)
是的,但有办法解决它。 –
有,但我必须考虑(并键入)一分钟才能拿出一个。 – GolezTrol
你的两条线唯一的区别是你order_by在失败的那一行中,对吗? 恰巧那个order_by不适合嵌套选择。
但是,您可以在包含select的where子句中执行order_by。
编辑:@StevenV是对的。
如果你想要做什么,我怀疑,这应该工作
Select A.Id, Count(*)
From MNO A
Join (Select ID From XYZ M Where M.ID=G.ID And Rownum=1 Order By Dbms_Random.Value) B On (B.ID = A.ID)
GROUP BY A.ID
我没有得到你想在这里做什么;你是否试图使用内部select中的一个随机记录来选择记录以在外部计数? – StevenV