[英]ORACLE SELECT DISTINCT VALUE ONLY IN SOME COLUMNS
+----+------+-------+---------+---------+
| id | order| value | type | account |
+----+------+-------+---------+---------+
| 1 | 1 | a | 2 | 1 |
| 1 | 2 | b | 1 | 1 |
| 1 | 3 | c | 4 | 1 |
| 1 | 4 | d | 2 | 1 |
| 1 | 5 | e | 1 | 1 |
| 1 | 5 | f | 6 | 1 |
| 2 | 6 | g | 1 | 1 |
+----+------+-------+---------+---------+
我需要获得该表所有字段的 select 但对于 id+type 的每个组合只能获得 1 行(我不在乎类型的值)。 但我尝试了一些没有结果的方法。
在我进行 DISTINCT 的那一刻,我不能包含字段的 rest 以使其在子查询中可用。 如果我在子查询中添加 ROWNUM ,所有行都会不同,这会导致它不起作用。
一些想法?
我目前更好的查询是:
SELECT ID, TYPE, VALUE, ACCOUNT
FROM MYTABLE
WHERE ROWID IN (SELECT DISTINCT MAX(ROWID)
FROM MYTABLE
GROUP BY ID, TYPE);
似乎您需要为每个不同的 id 和类型组合 select 一个(随机)行。 如果是这样,您可以使用row_number
分析 function 有效地做到这一点。 像这样的东西:
select id, type, value, account
from (
select id, type, value, account,
row_number() over (partition by id, type order by null) as rn
from your_table
)
where rn = 1
;
order by null
表示每组(分区)内的行按(id,type)随机排序; 这意味着在这种情况下,通常很耗时的订购步骤将变得微不足道。 此外,Oracle 优化了此类查询(对于过滤器rn = 1
)。
或者,在 12.1 及更高版本中,您可以使用match_recognize
子句获得相同的结果:
select id, type, value, account
from my_table
match_recognize (
partition by id, type
all rows per match
pattern (^r)
define r as null is null
);
这将按 id 和类型对行进行分区,它不对它们进行排序(这意味着随机排序),并且只从每个分区中选择“第一”行。 请注意,一些分析函数,包括row_number()
,需要order by
子句(即使我们不关心排序) - order by null
是习惯性的,但不能完全省略。 相比之下,在match_recognize
中,您可以省略order by
子句(默认为“随机顺序”)。 另一方面,您不能省略define
子句,即使它没有施加任何条件。 为什么 Oracle 也不使用该子句的默认值,只有 Oracle 知道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.