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

如何在Oracle中使用distinct或group by维护订单,oracle,sql-order-by,distinct,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 CS000000

我在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
CS_ID
CS0000000002
CS0000000004
CS0000000003
CS0000000001
添加distinct后,以下是输出。添加distinct后不维护Ordered

select distinct CS_ID from (
    select CS_ID,CS_Date from CSM order by CS_Date 
) v
这将产生:

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
CS_ID
CS0000000002
CS0000000004
CS0000000003
CS0000000001
我期待以下输出

CS_ID
CS0000000001
CS0000000002
CS0000000003
CS0000000004
您能建议如何使用distinct子句维护订单吗?

这将按照每个订单的最早cs\U日期顺序列出每个cs\U id

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只显示一次,通过独特的

实现您想要的功能您是按cs_id还是按cs_日期订购?在您的示例中,只需忽略cs_日期并对cs_id进行排序,就可以得到您想要的结果。如果要按cs_日期排序,是按mincs_日期、MAXS_日期排序,还是按其他逻辑排序?如果一个CS0001行位于第一个CS0002行之后,但在最后一个CS0002行之前,会发生什么情况?@Jason我想按cs_日期排序,可能还有其他列需要排序。但是,在保留顺序的同时,最终输出应该提供不同的CS_ID。您试图保留的顺序是什么?在您的示例中,没有重叠,因此您可以忽略日期,只按cs_id排序。我的猜测是,在实际表中,您可以有一些CS0001行的cs_日期在第一行CS0002之前,而一些CS0001行的cs_日期在第一行CS0002之后。如果是这样的话,您希望按哪个cs_日期排序?明克斯的约会?maxcs_日期?还有什么吗?如果有人想按+连接行数据分组,请参阅Thank@BrianDeMilia,它的工作正常。我又添加了一列进行排序,我需要这一列进行分页。因此,我修改了查询如下,其工作正常。我只是想知道它是否有效,或者是否有其他方法可以做到这一点。选择外部。*从选择行数rnum,内部。*从选择行数id从选择行数id,按行数id超额分配按行数日期超额分配,按行数日期超额分配,员工id描述为Rn,按行数日期超额分配,工作人员ID从csm描述为rn2,其中Rn=1由rn2内部外部WHERE Outer.Rnum>=2和Outer.Rnum@RajaReddy订购,用于分页目的,应该可以。