oracle 可以用level来分组吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 可以用level来分组吗相关的知识,希望对你有一定的参考价值。
可以的,用connected by level结构实现。
比如:
表结构数据现在是这样:
code stime etime
0001 08:00 12:00
0002 14:30 17:30
使用connect by level来得到每30分钟一条记录的结果,如下:
t
AS
(
SELECT \'0001\' AS code, \'08:00\' AS stime, \'12:00\' AS etime
FROM dual
UNION
SELECT \'0002\' AS code, \'14:30\' AS stime, \'17:30\' AS etime
FROM dual
)
SELECT code, decode(level, 1, stime, to_char(to_date(stime, \'hh24:mi\') + 30.0 / 60 / 24 * (level - 1), \'hh24:mi\')), decode(level, (to_date(etime, \'hh24:mi\') - to_date(stime, \'hh24:mi\')) * 24 * 60 / 30, etime, to_char(to_date(stime, \'hh24:mi\') + 30.0 / 60 / 24 * level, \'hh24:mi\')), level
FROM t
CONNECT BY code = PRIOR(code
AND PRIOR(dbms_random.value IS NOT NULL
AND level <= (to_date(etime, \'hh24:mi\') - to_date(stime, \'hh24:mi\')) * 24 * 60 / 30))
运行结果
code stime etime
0001 08:00 08:30
0001 08:30 09:00
0001 09:00 09:30
0001 09:30 10:00
0001 10:00 10:30
0001 10:30 11:00
0001 11:00 11:30
0001 11:30 12:00
0002 14:30 15:00
0002 15:00 15:30
0002 15:30 16:00
0002 16:00 16:30
0002 16:30 17:00
0002 17:00 17:30
根据等级来分组当然可以啦 参考技术B 一下是按照每6个小时分组
select mobile_no,area_name,max(created_time ),dt, count(*) as num from a_hy_locate1 i ,
(select (sysdate-13)-(level-1)/4 dt
from dual connect by level <= 34) d
where i.locate_type = 1 and
i.created_time<dt and i.created_time> d.dt-1/4
group by mobile_no,area_name,d.dt
另外一个方法:
--按六小时分组
select trunc(to_number(to_char(created_time, 'hh24')) / 6),count(*)
from t_test
where created_time > trunc(sysdate - 40)
group by trunc(to_number(to_char(created_time, 'hh24')) / 6)
--按12小时分组
select trunc(to_number(to_char(created_time, 'hh24')) / 6),count(*)
from t_test
where created_time > trunc(sysdate - 40)
group by trunc(to_number(to_char(created_time, 'hh24')) / 6) 参考技术C 可以!!
我都不知你问什麼.....
Oracle SQL using group by:你能按用于连接两个表的字段进行分组吗?
【中文标题】Oracle SQL using group by:你能按用于连接两个表的字段进行分组吗?【英文标题】:Oracle SQL using group by: Can you group by a field used to join two tables? 【发布时间】:2016-04-11 23:16:32 【问题描述】:SELECT b.first_name, b.last_name, SUM(t.price_total)
FROM brokers b
LEFT OUTER JOIN
trades t
ON b.broker_id=t.broker_id
GROUP BY
b.broker_id
我的问题是“显示每个经纪人交易的总价值”。答案按b.first_name||' '||b.last_name
分组,但我认为分组应该通过经纪人的 ID 完成(即两个同名的人可以分组在一起,这不会通过经纪人 ID 发生)。
但是在运行我的代码时,我得到一个错误
ORA-00979: not a GROUP BY expression
00979. 00000 - "not a GROUP BY expression"
*Cause:
*Action:
Error at Line: 1 Column: 8
我的问题是,为什么我不能使用 b.broker_id 作为唯一的分组依据?
【问题讨论】:
一般 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是一个集合函数的参数。 【参考方案1】:稍微不同的方法是按经纪人 ID 对交易进行分组,然后将结果加入经纪人表:
SELECT b.first_name, b.last_name, price_sum
FROM brokers b
LEFT OUTER JOIN (
SELECT broker_id, SUM(price_total) AS price_sum
FROM trades
GROUP BY broker_id
) t
ON b.broker_id=t.broker_id
我个人觉得这更清楚地表达了你想要做什么。
【讨论】:
【参考方案2】:试试这个:
SELECT b.broker_id, b.first_name, b.last_name, SUM(t.price_total)
FROM brokers b
LEFT OUTER JOIN
trades t
ON b.broker_id=t.broker_id
GROUP BY
b.broker_id, b.first_name, b.last_name
当您使用 GROUP BY 时,select 子句只能包含 GROUP BY 中指定的列以及该组的聚合/计算字段,例如 sum、average、min、max 等。
您可以使用分析函数来克服它,这主要用于避免自连接并在进行聚合时获取您需要的所有字段:
SELECT distinct * from (SELECT b.first_name, b.last_name,
SUM(t.price_total) over (partition by b.broker_id) price_total
FROM brokers b
LEFT OUTER JOIN
trades t
ON b.broker_id=t.broker_id);
【讨论】:
虽然这确实有效(谢谢),但为什么我不能只使用代理 ID 列?我的理解是您可以按任何非聚合的列进行分组,也可以按不在 SELECT 中的列进行分组。经纪人 ID 满足这两个要求【参考方案3】:这是因为您在 select 子句中包含了 b.first_name
和 b.last_name
,而不是聚合它们或按它们分组。
您可以将这两个项目添加到 group by 子句中,或者在 select 子句中对每个项目使用聚合函数(例如 max
),以使您的查询正常工作。
【讨论】:
【参考方案4】:只需在 GROUP BY 中添加 last_name 和 first_name
SELECT b.first_name, b.last_name, SUM(t.price_total)
FROM brokers b
LEFT OUTER JOIN
trades t
ON b.broker_id=t.broker_id
GROUP BY
b.broker_id,b.first_name, b.last_name
如果两个人的姓和名相同,由于 GROUP BY 中的 broker_id,结果中的行会不同
【讨论】:
谢谢,但是和上面的用户有同样的问题,为什么我不能只使用 broker id 列?我的理解是您可以按任何非聚合的列进行分组,也可以按不在 SELECT 中的列进行分组。经纪人 ID 满足这两个要求 @shen SELECT 语句中的所有列,不在聚合函数中,必须在 GROUP BY 中。问题不是 broker_id 列,而是 last_name 和 first_name【参考方案5】:尝试将您的 GROUP BY 子句更改为: ... 按 b.first_name、b.last_name 分组
【讨论】:
以上是关于oracle 可以用level来分组吗的主要内容,如果未能解决你的问题,请参考以下文章