获取查询以特定方式订购

时间:2012-09-12 10:15:52

标签: sql oracle sql-order-by

我有一个查询,在执行时会返回过去24小时内的所有小时数。因此,如果您在上午10:55运行查询,结果将是昨天上午11点至今天上午10点。

以下是我正在使用的查询:

select to_char(trunc(a_date,'HH24'),'HH24') col_x,
       type_name seriesname,
       sum(a_measure_3) col_y
from a_agg,
     (select trunc(sysdate, 'hh')-1 POS from dual)
where a_date >= POS
and   a_date <= POS + 1
group by trunc(a_date,'HH24'),
         type_name 
order by 2;

这是我要找的输出:

COL_X  | SERIESNAME  | COL_Y
-----------------------------------
 11    |  STATUS1    |  6715846
 12    |  STATUS1    |  7064692
 13    |  STATUS1    |  6821742
 14    |  STATUS1    |  6241758
 15    |  STATUS1    |  6364713
 16    |  STATUS1    |  6762539
 17    |  STATUS1    |  6200213
 18    |  STATUS1    |  8479341
 19    |  STATUS1    |  13346516
 20    |  STATUS1    |  10107274
 21    |  STATUS1    |  3716290
 22    |  STATUS1    |  1321966
 23    |  STATUS1    |  433947
 00    |  STATUS1    |  200273
 01    |  STATUS1    |  97429
 02    |  STATUS1    |  81726
 03    |  STATUS1    |  124943
 04    |  STATUS1    |  284946
 05    |  STATUS1    |  1360847
 06    |  STATUS1    |  4250001
 07    |  STATUS1    |  5840156
 08    |  STATUS1    |  6666608
 09    |  STATUS1    |  6949196
 10    |  STATUS1    |  982411

现在我的问题是,有没有办法通过COL_X来获取此特定输出,因为我当前的order by 2不会总是返回上述结果。

4 个答案:

答案 0 :(得分:3)

order by trunc(a_date,'HH24')不足够吗?您应该能够按顺序使用所有分组值,而不仅仅是选择列表表达式。

答案 1 :(得分:1)

我认为您希望按实际日期列(a_date)排序。 它不允许您自己订购,因为它不在组中使用。要允许它,您需要以某种方式聚合日期。只需使用MAX或MIN即可。

简而言之,就是ORDER BY MAX(a_date)

答案 2 :(得分:0)

是的,您可以在CASE子句中使用ORDER BY语句,如:

 ORDER BY 
    CASE WHEN COL_X > 10 AND COL_X <= 23
         THEN 0
    ELSE 1
    END

答案 3 :(得分:0)

试试这个:

只需将您的订单子句更改为

即可
Order by a_date

由于a_date是您的日期列,因此将按时间顺序排序