从列col1和2中选择不同的值,并按col3保持顺序

时间:2013-11-18 14:56:43

标签: database oracle

我很抱歉,如果这个问题是noobish - 我是SQL的新手,但是我已经进行了一些谷歌搜索并找不到合适的解决方案(或者由于SQL知识有限而无法理解)

我正在尝试获取按Col1排序的对Col2Col3的不同值,这似乎很容易实现:

select distinct Col1, Col2, Col3 from Table order by Col3 desc

我还需要摆脱Col3并获得重复的Col1和Col2对,并按Col3排序,但是当尝试在子查询中选择distinct时,顺序是改变。

select distinct Col1, Col2 from (select distinct Col1, Col2, Col3 from Table order by Col3) 

有解决方法吗? 如何获得Col1Col2的明确值,但按Col3排序?

以下是我处理的一些数据:

COL1        COL2    COL3
HOST_01     XR1     6387900000000
HOST_01     XR1     6280600000000
HOST_01     XR1     6237600000000
HOST_01     XR1     6194700000000
HOST_01     XR1     6080200000000
HOST_01     XR1     6058800000000
HOST_02     XR2     1134300000000
HOST_02     XR2     1132200000000
HOST_02     XR2     1130600000000
HOST_02     XR2     1128600000000
HOST_02     XR2     1128000000000
HOST_02     XR2     1121900000000
HOST_06     YR1     1120100000000
HOST_02     XR2     1113500000000
HOST_06     YR1     1072100000000
HOST_06     YR1     1050600000000
HOST_10     IT0     1050600000000
HOST_06     YR1     979010000000
HOST_06     YR1     971750000000
HOST_06     YR1     952110000000
HOST_06     YR1     930640000000
HOST_06     YR1     926500000000
HOST_10     IT0     926500000000
HOST_06     YR1     922210000000

我需要输出看起来像:

COL1     COL2
HOST_01  XR1
HOST_02  XR2
HOST_06  YR1
HOST_10  IT0
HOST_06  YR1
HOST_10  IT0

2 个答案:

答案 0 :(得分:0)

你可以写:

select distinct Col1, Col2 from Table order by Col3

您无需选择用于订购的列。

答案 1 :(得分:0)

我们在评论中已经进行了很长时间的讨论,而且我仍然没有100%明确你需要什么,但我希望这两个选项中的一个可以让你接近。

第一个查询将生成您似乎要求的内容 - 没有复制行的原始列表。但是,它与您的示例输出不同,因为存在无序值。例如:

HOST_06     YR1     1120100000000
HOST_02     XR2     1113500000000
HOST_06     YR1     1072100000000

这是SQL:

select 
  col1,col2
from 
(
  select 
    col1,col2,col3,
    lag(col1,1,0) over(order by col3 desc) last_col1,
    lag(col2,1,0) over(order by col3 desc) last_col2,
    rownum row_num
  from 
    test
) 
where
  col1 != last_col1 or col2 != last_col2
order by 
  row_num

输出:

HOST_01     XR1
HOST_02     XR2
HOST_06     YR1
HOST_02     XR2
HOST_06     YR1
HOST_10     IT0
HOST_06     YR1
HOST_10     IT0
HOST_06     YR1

SQLFiddle

第二个选项只使用每个col1 / col2的max(col3)。这与您的示例输出非常匹配,删除了重复的行。

SQL

select
  col1,col2
from
(
  select col1,col2,max(col3)
  from test
  group by col1,col2
  order by 3 desc
)

输出:

HOST_01     XR1
HOST_02     XR2
HOST_06     YR1
HOST_10     IT0

SQLFiddle