我的数据在单独的表中具有类别和子类别。当我写一个查询来加入他们时,我得到下表,其中类别行重复:
| 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的引用,这些引用似乎并不适合用例。我知道这里的答案通常是“使用前端工具”,但这对我而言并不是真正的选择。
答案 0 :(得分:1)
您好,这确实可以满足您的要求
数据(DDL)
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');
SQL查询(答案)
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
答案 1 :(得分:1)
重复比较好。但是,您可以使用row_number()
:
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, ?;
请注意,?
用于指定顺序的列-定义每一行的“第一”。
在外部查询中包括order by
非常重要。 SQL结果集(如表)是无序。如果没有order by
,则可以按任何顺序返回行,但是在这种情况下,顺序很重要。