0

我最近得到了一些关于 oracle 查询的帮助,但不太了解它是如何工作的,因此无法让它与我的数据一起工作。有没有人能够解释逻辑步骤中发生的事情的逻辑以及实际从现有表的列中获取哪些变量?我正在寻找从读数表中选择数据(列名是:天、小时、体积)并通过返回所有读数找到每天每小时的平均体积读数(因此按天、小时分组)对于过去的那个小时/天组合(就我的数据集而言)并写出它的平均值。完成后,它将结果写入具有相同列名(日、小时、卷)的不同表。除非我按小时写回,否则“音量”将是过去一天中那个小时的平均值。例如,我想找出过去所有星期三晚上 7 点的平均值,并将平均值输出到新记录。假设使用了这 3 列并参考下面的代码,我不确定“小时”与“小时”有何不同以及 t1 变量代表什么。任何帮助表示赞赏。

INSERT INTO avg_table (days, hours, avrg)
   WITH xweek
        AS (SELECT ds, LPAD (hrs, 2, '0') hrs
              FROM (    SELECT LEVEL ds
                          FROM DUAL
                    CONNECT BY LEVEL <= 7),
                   (    SELECT LEVEL - 1 hrs
                          FROM DUAL
                    CONNECT BY LEVEL <= 24))
     SELECT t1.ds, t1.hrs, AVG (volume)
       FROM xweek t1, tables t2
      WHERE     t1.ds = TO_CHAR (t2.day(+), 'D')
            AND t1.hrs = t2.hour(+)
   GROUP BY t1.ds, t1.hrs;
4

1 回答 1

1

我会稍微重写一下,这样更有意义(至少对我来说)。

为了一点一点地分解它,CONNECT BY是一个分层(递归)查询。这是生成行的常见“作弊”。在本例中,7 代表一周中的每一天,编号为 1 到 7。

 SELECT LEVEL ds
   FROM DUAL
CONNECT BY LEVEL <= 7

下一个生成 0 到 23 小时来表示午夜到晚上 11 点。然后将它们以笛卡尔或CROSS JOIN的旧样式连接在一起。这意味着返回每个可能的行组合,即它在一周内每天的每个小时生成。

WITH 子句在SELECT 语句的文档中进行了描述,它通常称为公用表表达式 (CTE),或在 Oracle 中称为子查询因子子句。这使您可以为子查询分配名称并在多个位置引用该单个子查询。它还可用于保持代码清洁或在内存中生成临时表以供随时访问。在这种情况下它不是必需的,但它确实有助于很好地分离代码。

最后,这+是 Oracle 用于外连接的旧表示法。它们大部分是等效的,但在这个问题和答案中描述了一些非常小的差异。

正如我在开始时所说的,我会重新编写它以符合 ANSI 标准,因为我发现它更具可读性

insert into avg_table (days, hours, avrg)
with xweek as (
select ds, lpad(hrs, 2, '0') hrs
  from ( select level ds 
           from dual 
        connect by level <= 7 )
 cross join ( select level - 1 hrs 
                from dual 
             connect by level <= 24 )
       )
select t1.ds, t1.hrs, avg(volume)
 from xweek t1
 left outer join tables t2
   on t1.ds = to_char(t2.day, 'd')
  and t1.hrs = t2.hour
group by t1.ds, t1.hrs;

更详细地说,该t1变量表示 CTE 的别名,week1这样您就不必每次都输入整个内容。hrs是生成表达式的别名,当你明确引用它时,你需要给它起个名字。HOURS是您自己表中的一列。

至于这是否正确,我不确定,你的意思是你只想要一天而不是整个星期,所以只有你才能决定这是否正确?我也觉得有点奇怪,您需要HOURS表格中的列是左填充的字符 0s lpad(hrs, 2, '0'),再一次,只有您知道这是否正确。

我强烈建议您自己尝试一下,并弄清楚一切是如何结合在一起的。您似乎还缺少一些基础知识,获取教科书或在互联网上四处看看,或者 Stack Overflow,有很多例子。

于 2013-06-01T14:32:34.243 回答