我有一个查询,在执行时会返回过去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
不会总是返回上述结果。
答案 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是您的日期列,因此将按时间顺序排序