Oracle SQL从某些列中删除重复结果
我的数据在单独的表中有类别和子类别。当我编写一个查询来连接它们时,我得到下表,其中类别行重复出现:Oracle SQL从某些列中删除重复结果,sql,oracle,Sql,Oracle,我的数据在单独的表中有类别和子类别。当我编写一个查询来连接它们时,我得到下表,其中类别行重复出现: | Col1 | Col2 | Col3 | Col 4 | |-------|-----------|------------|-------| | Cat1 | Cat1 Data | Subcat 1.1 | Etc | |-------|-----------|------------|-------| | Cat1 | Cat1 Data | Subca
| Col1 | Col2 | Col3 | Col 4 |
|-------|-----------|------------|-------|
| Cat1 | Cat1 Data | Subcat 1.1 | Etc |
|-------|-----------|------------|-------|
| Cat1 | Cat1 Data | Subcat 1.2 | Etc |
|-------|-----------|------------|-------|
| Cat1 | Cat1 Data | Subcat 1.3 | Etc |
|-------|-----------|------------|-------|
| Cat2 | Cat2 Data | Subcat 2.1 | Etc |
|-------|-----------|------------|-------|
| Cat2 | Cat2 Data | Subcat 2.2 | Etc |
|-------|-----------|------------|-------|
| Cat2 | Cat2 Data | Subcat 2.3 | Etc |
|-------|-----------|------------|-------|
有没有办法让它打印出来,主分类只显示一次
| Col1 | Col2 | Col3 | Col 4 |
|-------|-----------|------------|-------|
| Cat1 | Cat1 Data | Subcat 1.1 | Etc |
|-------|-----------|------------|-------|
| | | Subcat 1.2 | Etc |
|-------|-----------|------------|-------|
| | | Subcat 1.3 | Etc |
|-------|-----------|------------|-------|
| Cat2 | Cat2 Data | Subcat 2.1 | Etc |
|-------|-----------|------------|-------|
| | | Subcat 2.2 | Etc |
|-------|-----------|------------|-------|
| | | Subcat 2.3 | Etc |
|-------|-----------|------------|-------|
联机搜索仅返回对使用distinct或groupby的引用,这些引用似乎并不真正适合用例。我知道这里的答案通常是“使用前端工具”,但在我的情况下,这不是真正的选项。您好,这似乎是您想要的 数据(DDL) SQL查询(答案)
你最好还是重复一遍。但是,您可以使用
行编号()
:
请注意,?
用于指定顺序的列,即定义每行“第一个”的内容
在外部查询中包含order by非常重要。SQL结果集(如表)是无序的。如果没有order by,可以按任何顺序返回行,但在这种情况下,排序很重要。有趣的解决方案。顺便说一下,看起来可以省略按null划分的
分区
create table example(
col1 varchar(100),
col2 varchar(100),
col3 varchar(100),
col4 varchar(100)
);
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.1', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.2', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
select
CASE WHEN lag(col1) over (partition by null order by col1) = col1 THEN null ELSE col1 END col1,
CASE WHEN lag(col2) over (partition by null order by col2) = col2 THEN null ELSE col2 END col2,
col3, col4
From example
select (case when row_number() over (partition by col1, col2 order by ?) = 1
then col1
end) as col1
(case when row_number() over (partition by col1, col2 order by ?) = 1
then col2
end) as col2,
. . .
from t
order by col1, col2, ?;