【发布时间】:2020-12-22 19:09:48
【问题描述】:
我有这个语句返回表中存在的日期的值,然后 cte 只填充半小时间隔。
with cte (reading_date) as (
select date '2020-11-17' from dual
union all
select reading_date + interval '30' minute
from cte
where reading_date + interval '30' minute < date '2020-11-19'
)
select c.reading_date, d.reading_value
from cte c
left join dcm_reading d on d.reading_date = c.reading_date
order by c.reading_date
但是,后来我需要在这样的 SELECT 中使用 A SELECT:
SELECT serial_number,
register,
reading_date,
reading_value,,
ABS(A_plus)
FROM
(
SELECT
serial_number,
register,
TO_DATE(reading_date, 'DD-MON-YYYY HH24:MI:SS') AS reading_date,
reading_value,
LAG(reading_value,1, 0) OVER(ORDER BY reading_date) AS previous_read,
LAG(reading_value, 1, 0) OVER (ORDER BY reading_date) - reading_value AS A_plus,
reading_id
FROM DCM_READING
WHERE device_id = 'KXTE4501'
AND device_type = 'E'
AND serial_number = 'A171804699'
AND reading_date BETWEEN TO_DATE('17-NOV-2019' || ' 000000', 'DD-MON-YYYY HH24MISS') AND TO_DATE('19-NOV-2019' || ' 235959', 'DD-MON-YYYY HH24MISS')
ORDER BY reading_date)
ORDER BY serial_number, reading_date;
更多信息:
我正在从一个存在的表中选择数据,并使用滞后函数来计算 read_value 与先前记录的差异。但是,后来我需要在缺少半小时读取的地方插入虚拟数据。 CTE 表带回了我查询的两个日期之间所有半小时间隔的列表。
最终我想得到一个结果,其中包含半小时内的所有读数日期、读数值(如果有的话)以及确实存在的读数值之间的差异。对于没有从表 DCM_READING 返回数据的半小时读取,我只想返回 NULL。
是否可以使用多选的 CTE 表?
【问题讨论】:
-
你尝试了什么?
-
不清楚您希望如何合并这两个查询。请提供样本数据和期望的结果,以及逻辑解释。
-
CTE 只是一种内联视图,您可以在查询中多次使用它。您不能单独保存它以便在多个查询中重复使用。为此,您需要创建一个视图或 SQL Macro function(需要 19.8 或更高版本)。
标签: sql oracle common-table-expression