【问题标题】:Multiple SELECTS and a CTE table多个 SELECTS 和一个 CTE 表
【发布时间】: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


【解决方案1】:

不确定您想要实现什么,但您可以拥有多个 CTE,甚至可以嵌套它们:

with 

cte_1 as
(
    select username
    from dba_users
    where oracle_maintained = 'N'
),

cte_2 as
(
    select owner, round(sum(bytes)/1024/1024) as megabytes
    from dba_segments
    group by owner
),

cte_3 as
(
    select username, megabytes
    from cte_1
    join cte_2 on cte_1.username = cte_2.owner
)

select *
from cte_3
order by username;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2021-11-26
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多