【问题标题】:Dynamic LAG function (Standard SQL, BigQuery). Is it possible?动态 LAG 函数(标准 SQL、BigQuery)。是否可以?
【发布时间】:2021-03-26 22:42:09
【问题描述】:

我正在努力寻找解决方案。我还附上了一张图片,其中概述了我想要的东西,但我也会在这里写。

在LAG函数中,语法中是否可以有动态数字?

LAG(sessions, 3)

我需要列数minutosdelift,而不是使用 3,在本例中为 3,但每种情况会有所不同。

我尝试使用LAG(sessions, minutosdelift),但这是不可能的。我试过LAG(sessions, COUNT(minutosdelift)) 也不行。

最终目标是计算 52 和 6 之间的差异。所以,(52/6)-1 给了我 767%。但要做到这一点,我需要一个动态数字到 LAG 函数中(或其他想法)。

我尝试过使用ROWS PRECEDING AND ROWS UNBOUNDED PRECEDING,但它再次需要一个文字数字。

请问您知道怎么做吗?谢谢!

这个屏幕截图可能会解释它:

enter image description here

我的代码:这是我尝试的最后一个查询,因为我有 7 个以前的视图

SELECT 
    DATE, HOUR, MINUTE, SESSIONS, PROGRAMA_2, 
    janela_lift_teste, soma_sessao_programa_2, minutosdelift,
    CASE 
       WHEN minutosdelift != 0 
          THEN LAG(sessions, 3) OVER(ORDER BY DATE, HOUR, MINUTE ASC)
    END AS lagtest,
    CASE 
       WHEN programa_2 = "#N/A" OR programa_2 is null 
          THEN LAST_VALUE(sessions) OVER (PARTITION BY programa_2 ORDER BY DATE, HOUR, MINUTE ASC)
    END AS firstvaluetest,
FROM 
    tbl8
GROUP BY 
    DATE, HOUR, MINUTE, SESSIONS, PROGRAMA_2, 
    janela_lift_teste, minutosdelift, soma_sessao_programa_2
ORDER BY 
    DATE, HOUR, MINUTE ASC

【问题讨论】:

    标签: sql google-bigquery lag


    【解决方案1】:

    在 BigQuery 中(与其他一些数据库一样),lag() 的参数必须是常量。

    解决此问题的一种方法是使用自联接。我发现很难听懂您的问题,但想法是:

    with tt as (
          select row_number() over (order by sessions) as seqnum,
                 t.*
          from t
         )
    select t.*, tprev.*
    from t join
         t tprev
         on tprev.seqnum = t.seqnum - minutosdelift;
    

    【讨论】:

    • 嗨,戈登!感谢在这里回答我的问题。抱歉耽搁了,但正如我对米哈伊尔说的那样,我正在度假,我现在正在努力。
    • 嗨,戈登!感谢在这里回答我的问题。抱歉耽搁了,但正如我对米哈伊尔说的那样,我正在度假,我现在正在努力。到目前为止,我已经尝试使用 ROW_NUMBER() ,但我无法真正获得正确的数字。我不确定我是否会在这里分享,但我会尝试。我正在尝试一些解决方案,我会回来与您分享! Tks
    • @julius.86 。 . .我不明白你的评论。这应该是实现您的问题所要求的逻辑。
    • 嗨,戈登!是的,我今天试过并且工作了。感谢那!我在上一条评论中想说的是,我在这里的问题之前尝试使用 ROW_NUMBER() 并且它没有用。在您发表评论后它起作用了。谢了!
    【解决方案2】:

    考虑以下示例 - 希望您可以将此方法应用于您的用例

    #standardSQL
    with `project.dataset.table` as (
      select 1 session, timestamp '2021-01-01 00:01:00' ts, 10 minutosdelift  union all
      select 2, '2021-01-01 00:02:00', 1 union all
      select 3, '2021-01-01 00:03:00', 2 union all
      select 4, '2021-01-01 00:04:00', 3 union all
      select 5, '2021-01-01 00:05:00', 4 union all
      select 6, '2021-01-01 00:06:00', 5 union all
      select 7, '2021-01-01 00:07:00', 3 union all
      select 8, '2021-01-01 00:08:00', 1 union all
      select 9, '2021-01-01 00:09:00', 2 union all
      select 10, '2021-01-01 00:10:00', 8 union all
      select 11, '2021-01-01 00:11:00', 6 union all
      select 12, '2021-01-01 00:12:00', 4 union all
      select 13, '2021-01-01 00:13:00', 2 union all
      select 14, '2021-01-01 00:14:00', 1 union all
      select 15, '2021-01-01 00:15:00', 11 union all
      select 16, '2021-01-01 00:16:00', 1 union all
      select 17, '2021-01-01 00:17:00', 8 
    )
    select a.*, b.session as lagtest
    from `project.dataset.table` a 
    left join `project.dataset.table` b
    on b.ts = timestamp_sub(a.ts, interval a.minutosdelift minute)  
    

    有输出

    【讨论】:

    • 嗨,米哈伊尔!感谢您的回答。我现在正在度假。一旦我回来,我一定会尝试并回到这里。
    • 你好,米哈伊尔!我又来了!我现在正在研究它,看来您的解决方案可能效果很好!感谢您分享您的知识。我唯一担心的是我的数据集按日期、小时和分钟不完整。因此,脚本不会提前几分钟,因为没有这些分钟。但我会用一个完整的数据集做一个测试,我认为它会起作用。我会回来告诉你的!再次感谢!
    • 嗨,米哈伊尔!就像你说的那样,它以前可以计算数据。再次感谢您回复我!
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多