【问题标题】:unable to use the results of conditional_true_event in subquery无法在子查询中使用 conditional_true_event 的结果
【发布时间】:2022-01-06 16:33:23
【问题描述】:

我的桌子是

         ts          | symbol | bid
---------------------+--------+------
 2009-01-01 03:00:00 | XYZ    |   10
 2009-01-01 03:00:03 | XYZ    |   11
 2009-01-01 03:00:06 | XYZ    | 10.5
 2009-01-01 03:00:09 | XYZ    |   11
 2009-01-01 03:00:00 | ABC    |   10
 2009-01-01 03:00:03 | ABC    |   11
 2009-01-01 03:00:06 | ABC    |   11
 2009-01-01 03:00:09 | ABC    |   11

我想运行一个查询,首先获取符号为ABC 的所有行,然后我想根据条件将它们放在窗口中,然后选择第二个窗口。

子查询有效(如果不使用子查询)

select * 
from 
    (select 
         ts, symbol, bid, 
         conditional_true_event(bid > 10.6) over(order by ts) as window 
     from Tickstore3 
     where symbol = 'ABC')  as t3;

输出:

         ts          | symbol | bid | window
---------------------+--------+-----+--------
 2009-01-01 03:00:00 | ABC    |  10 |      0
 2009-01-01 03:00:03 | ABC    |  11 |      1 <-- I want to get only this row
 2009-01-01 03:00:06 | ABC    |  11 |      2
 2009-01-01 03:00:09 | ABC    |  11 |      3 

但我不能只得到第二行

select * 
from 
    (select 
         ts, symbol, bid, 
         conditional_true_event(bid > 10.6) over(order by ts) as window 
     from Tickstore3 
     where symbol = 'ABC') as t3 
where window = 1;

我收到一个错误:

错误 4856:在字符 151 处或附近的“窗口”处出现语法错误
LINE 1: ...w from Tickstore3 where symbol='ABC') as t3 where window=1;

【问题讨论】:

  • 不确定 vertica 但window 可能是一个有问题的标识符。我会换一个不同的。
  • @TheImpaler 是对的。 WINDOW 是启动 named window 子句的关键字 - 一个保留字。切勿在对象名称中使用保留字。

标签: sql vertica


【解决方案1】:

发现了错误。我不能推荐window。我必须将它与临时结果名称一起使用

select * from (select ts, symbol, bid, conditional_true_event(bid > 10.6) over(order by ts) as
 window from Tickstore3 where symbol='ABC') as t3 where t3.window=1 ; <-- note t3.window
         ts          | symbol | bid | window
---------------------+--------+-----+--------
 2009-01-01 03:00:03 | ABC    |  11 |      1
(1 row)

【讨论】:

    【解决方案2】:

    我认为CONDITIONAL_TRUE_EVENT() 在这里完全是矫枉过正。

    有条件的运行总和(使用CASE WHEN ... 表达式)会做得很好。

    而且,只是为了好玩,我添加了 named window 子句,以说明为什么它是保留字 - 我认为 counter 是您想要的更合适的名称过滤...

    如果您明智地选择,正确的程序员的话可以使任何文档或注释变得多余...

    WITH                                                                                                                                                                                                    
    -- your input ...
    tickstore(ts,symbol,bid) AS (
              SELECT TIMESTAMP '2009-01-01 03:00:00','XYZ',10
    UNION ALL SELECT TIMESTAMP '2009-01-01 03:00:03','XYZ',11
    UNION ALL SELECT TIMESTAMP '2009-01-01 03:00:06','XYZ',10.5
    UNION ALL SELECT TIMESTAMP '2009-01-01 03:00:09','XYZ',11
    UNION ALL SELECT TIMESTAMP '2009-01-01 03:00:00','ABC',10
    UNION ALL SELECT TIMESTAMP '2009-01-01 03:00:03','ABC',11
    UNION ALL SELECT TIMESTAMP '2009-01-01 03:00:06','ABC',11
    UNION ALL SELECT TIMESTAMP '2009-01-01 03:00:09','ABC',11
    )
    -- real query starts here, replace following comma with "WITH" ...
    ,
    w_counter AS (
      SELECT
        *
      , SUM(CASE WHEN bid > 10.6 THEN 1 END) OVER w AS counter
      FROM tickstore
      WHERE symbol='ABC'
      WINDOW w AS (ORDER BY ts)
    )
    SELECT
      ts
    , symbol
    , bid
    , counter
    FROM w_counter
    WHERE counter=1
    ;
    -- out          ts          | symbol | bid  | counter 
    -- out ---------------------+--------+------+---------
    -- out  2009-01-01 03:00:03 | ABC    | 11.0 |       1
    

    【讨论】:

    • 从技术上讲,我不能接受你的回答,因为它不能解决我面临的特定问题。但是,它确实显示了编写查询的正确方法。谢谢
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多