首页 > 解决方案 > Oracle SQL 从某些列中取出重复的结果

问题描述

我的数据在不同的表中有类别和子类别。当我编写查询以加入它们时,我得到下表,其中类别行重复:

|  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 的引用,这些引用似乎并不真正适合用例。我知道这里的答案通常是“使用前端工具”,但在我的情况下这并不是真正的选择。

标签: sqloracle

解决方案


你最好重复一遍。但是,您可以使用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,可以按任何顺序返回行,但在这种情况下排序很重要。


推荐阅读