我正在尝试按照我在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子句按照给出的确切顺序返回数据!如下图所示?
答案 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);