[英]Concatenation of max_times within 15 minute time intervals SQL
我正在尝试编写一个SQL查询,该查询提取一个ID并在从第一次开始的15分钟时间间隔内连接最大时间。
即对于一个log_id数据可能是
101 01:01
101 01:08
101 01:23
101 02:01
101 02:10
101 02:16
我们想展示
101 01:01, 01:08, 01:23, 2:01, 2:16
有任何想法吗?
这是我们正在使用的起始查询:
select
ol.log_id,
ifm.meas_value,
ifm.measure_id,
ifm.recorded_time
from meas ifm
inner join rec ifr on ifm.fsd_id = ifr.fsd_id
inner join pe on ifr.data_id = pe.data_id
inner join record_summary f on pe.n_id = f.n_id
inner join pe2 on pe.t_id = pe2.t_id and pe.date = pe2.date and pe2.type = 51
inner join log l on pe2.ata_id = l.data_id and l.date = pe2.date
where ifm.measure_id in ('891')
and ol.date >= trunc(sysdate - 3)
对于每个log_id,将有多个记录的时间是我们要拉的第一次时间,以及每15分钟间隔直到最后一次的最长时间。 这些时间将被串联到一个列表中。
我们尝试了使用所有值的listagg,但次数太多了,因此最终用户希望每15分钟仅看到一个值。
基本上,您有3个问题合而为一:
如何将日期字段四舍五入到15分钟? https://community.oracle.com/thread/1042863
ceil(to_number(to_char(test_timestamp,'yyyymmddhh24mi'))/ 15)* 15
如何从组中获取行?
这是一个非常受欢迎的问题,您会在这里找到一些东西: https : //stackoverflow.com/questions/tagged/oracle+greatest-n-per-group?sort=votes&pageSize=30
如何汇总字符串值以在组内进行串联:
LISTAGG(convertedTimeField,'')
尝试将所有三个部分组合在一个查询中以获得所需的结果。
为了简化下表的使用:
CREATE TABLE Test ( id NUMBER, log DATE );
(注意:oracle中的DATE
实际上是dateTime。使用||
进行字符串连接。)
您的给定列表似乎表明,当最大值和最小值相同时,您只显示一次,这可以通过分组两次来完成:
SELECT
O.id,
O.logDate,
LISTAGG(O.logTimes, ', ') WITHIN GROUP (ORDER BY O.logTimes) logTimes
FROM (
SELECT
O.id,
O.logDate,
O.G G,
CASE
WHEN TO_CHAR(MIN(O.log), 'HH24:MI') <> TO_CHAR(MAX(O.log), 'HH24:MI') THEN
TO_CHAR(MIN(O.log), 'HH24:MI') || ', ' || TO_CHAR(MAX(O.log), 'HH24:MI')
ELSE
TO_CHAR(MIN(O.log), 'HH24:MI')
END logTimes
FROM (
SELECT
T.id,
T.log,
TRUNC(T.log) logDate,
TO_CHAR(T.log, 'HH24') || FLOOR(TO_NUMBER(TO_CHAR(T.log, 'MI')) / 15) G
FROM
Test T
) O
GROUP BY
O.id, O.logDate, O.G
) O
GROUP BY
O.id, O.logDate
;
请参见SQL提琴 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.