如何在Oracle中使用distinct或group by维护订单

时间:2015-03-29 17:26:51

标签: oracle sql-order-by distinct

我在Oracle DB的表中有几列,一个是varchar2类型,而另一个是date。我想检索不同的有序数据

以下是以下查询的输出

select CS_ID,CS_Date from CSM order by CS_Date;

产生:

CS_ID                    CS_Date
CS0000000001    29/03/15 14:23:25.872000000
CS0000000001    29/03/15 14:23:30.546000000
CS0000000001    29/03/15 14:23:30.577000000
CS0000000001    29/03/15 14:24:54.331000000
CS0000000001    29/03/15 14:39:51.881000000
CS0000000001    29/03/15 14:44:18.306000000
CS0000000001    29/03/15 14:44:27.372000000
CS0000000002    29/03/15 15:38:40.657000000
CS0000000003    29/03/15 18:41:15.409000000
CS0000000004    29/03/15 19:31:45.614000000

添加distinct后,输出如下。添加不同的

后,不会保持有序
select distinct CS_ID from (
    select CS_ID,CS_Date from CSM order by CS_Date 
) v

产生:

CS_ID
CS0000000002
CS0000000004
CS0000000003
CS0000000001

我期待以下输出

CS_ID
CS0000000001
CS0000000002
CS0000000003
CS0000000004

请问您如何使用distinct子句维护订单?

2 个答案:

答案 0 :(得分:2)

这会按照最早 cs_id的顺序列出每个cs_date

select cs_id
from(
select cs_id,
       row_number() over(partition by cs_id order by cs_date) as rn,
       row_number() over(order by cs_date) as rn2
from csm
)
where rn = 1
order by rn2

(同样,只显示每个cs_id一次,用distinct达到你想要的效果

答案 1 :(得分:0)

select cs_id
from (select cs_id, min(cs_date) as min_cs_date
    from csm
    group by cs_id)
order by min_s_date