Oracle group by子句按数据顺序排列

时间:2018-04-16 17:02:38

标签: sql oracle plsql group-by

我正在尝试按照我在PL / SQL过程中收到的特定顺序对下面的数据进行分组。我的过程中填充了自定义表类型FOIL_MAP,并且当前包含如下所示的数据:

https://i.stack.imgur.com/ovZEQ.png

我写了这个问题:

select Foil_Keys, count(Foil_Keys) FCNT from Table(FOIL_MAP) group by Foil_Keys;

我得到了输出:

https://i.stack.imgur.com/Xe6z7.png

有没有办法让group by子句按照给出的确切顺序返回数据!如下图所示?

https://i.stack.imgur.com/e06Lj.png

2 个答案:

答案 0 :(得分:1)

select Foil_Keys, count(Foil_Keys) FCNT from Table(FOIL_MAP) group by Foil_Keys
order by foil_keys desc

答案 1 :(得分:1)

  

...按照......中给出的确切顺序返回数据。

不,我很抱歉,但没有。

您希望按照插入表格的顺序返回数据。返回行时,SQL标准未指定任何顺序。数据库可以按任何顺序返回数据,这样就可以了;订单甚至可能会及时改变。现在,如果您需要任何特定订单,则需要使用ORDER BY

使用额外列的替代解决方案

无论如何,如果您想按照插入的顺序返回数据,那么您需要在表中添加一个额外的列来表示数据插入的日期/时间。如果您这样做,您可以按该列排序。

如果时间戳列不够好,因为插入的粒度很小(因此值可能会发生碰撞),那么您可以使用序列。

alter table foil_map add (my_order decimal(12) not null);

create sequence insert_order_seq;

当插入表格时:

insert into foil_map (col1, col2, ..., my_order)
  values (val1, val2, ..., insert_order_seq.nextval);

,您的查询将变为:

select foil_keys, count(foil_keys) fcnt 
  from foil_map 
  group by foil_keys 
  order by max(my_order);