选择3列与Oracle中的5个选定列不同

时间:2016-11-26 04:26:07

标签: oracle

输入表数据:

|Col1  |Col2    |Col3   |Col4   |Col5
|----  | ---    |---    |---    |---
|AA    | 11     |9009   |1      |1
|AA    | 11     |9009   |2      |2
|BB    | 22     |8888   |1      |1
|CC    | 33     |7777   |1      |1
|CC    | 33     |7777   |2      |2
|DD    | 44     |6666   |1      |1
|EE    | 55     |5555   |1      |1
|EE    | 55     |5555   |2      |2

这应保存到目标表中,如下所示,因为col1,col2,col3是使用复合主键定义的:

Col1   |Col2   |Col3   |Col4  |Col5
-----------------------------------
AA     |11     |9009   |1     | 1
BB     |22     |8888   |1     | 1
CC     |33     |7777   |2     | 2
DD     |44     |6666   |1     | 1
EE     |55     |5555   |2     | 2

如何在前3列使用distinct,但是选择所有5列?

我已经看到了选择一个不同列的其他示例。有谁可以帮助这个例子?

2 个答案:

答案 0 :(得分:1)

一种方法是为前三列的每个组合排序行 - 这是分析函数的工作,特别是在这种情况下row_number()。然后从每个“组”(或分析函数术语中的“分区”)中选择“第一行”。像

这样的东西
select col1, col2, col3, col4, col5
from   ( select col1, col2, col3, col4, col5,
                row_number() over (partition by col1, col2, col3 order by null) as rn
         from   input_table
       )
where  rn = 1
;

order by null表示“按照您想要的顺序排序,我不在乎,只需在每个分区中排序。”

答案 1 :(得分:0)

另一种变体是使用GROUP BY,并在辅助列上聚合函数。例如:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.10</version>
</dependency>