【问题标题】:How can I use the LAG FUNCTION in Snowflake with TIMESTAMPS?如何在带有 TIMESTAMPS 的 Snowflake 中使用 LAG FUNCTION?
【发布时间】:2021-02-23 15:39:54
【问题描述】:

这是我的基本表的构建方式:

我的用户有各种操作日期作为时间戳(日期、小时、分钟、秒)。用户的操作要么相隔几天,要么相隔几个小时。我正在尝试使用 LAG 功能查找每个用户的每个操作之间的间隔。当我将时间戳转换为 DATES 时,我在 Snowflake 中的查询工作得非常好。当用户在同一天有 2 个操作时,我的时间间隔是 = 0。我想根据分钟(或秒,没关系)查看这个时间间隔。这是我在雪花中使用的当前查询:

 SELECT 
    USERS,
  RANK() OVER(PARTITION BY USERS ORDER BY ACTION_DATE ASC) RowNumber,
  CAST(ACTION_DATE AS DATE),
  (CAST(ACTION_DATE AS DATE) - LAG(CAST(ACTION_DATE AS DATE)) OVER (PARTITION BY users ORDER BY ACTION_DATE)) AS TIME_INTERVAL
from TABLE1
ORDER BY 1,2,3;

到目前为止,此查询在 Snowflake 中运行良好,但我需要能够使用我的时间戳获取这些时间间隔,而不仅仅是将我的时间戳转换为日期。

我在雪花中得到的错误是:

SQL 编译错误:第 6 行错误,位置 21 函数“-”的参数类型无效:(TIMESTAMP_NTZ(9), TIMESTAMP_NTZ(9))

有人知道我如何使用带有时间戳的 LAG FUNCTION 或者我应该使用其他函数吗?

【问题讨论】:

    标签: sql snowflake-cloud-data-platform lag


    【解决方案1】:

    如果您想要区别,请使用datediff()timestampdiff()。几秒钟:

    DATEDIFF(second,
             LAG(ACTION_DATE) OVER (PARTITION BY users ORDER BY ACTION_DATE),
             ACTION_DATE
            ) AS DIFF_SECONDS
    

    【讨论】:

    • 嗨@JustineMit - 如果答案对您有帮助,请点赞和/或接受。
    【解决方案2】:

    您需要使用timestampdiffdatediff,因为您不能使用- 运算符减去两个时间戳。这是一个可重现的示例,展示了如何在几秒钟、几分钟和几小时内执行此操作。

    create or replace transient table users
    (
        users       varchar,
        action_date timestamp_ntz
    );
    
    insert overwrite into users
    values ('simon', '2020-01-01T01:00:00'),
           ('simon', '2020-01-01T02:00:00'),
           ('simon', '2020-01-02T01:00:00'),
           ('simon', '2020-01-02T02:00:00'),
           ('simon', '2020-01-03T01:00:00'),
           ('simon', '2020-01-04T01:00:00'),
           ('jen', '2020-01-01T01:00:00'),
           ('jen', '2020-01-02T01:00:00'),
           ('jen', '2020-01-03T01:00:00'),
           ('jen', '2020-01-04T01:00:00')
    ;
    
    SELECT
        USERS                                                                                 as users,
        action_date                                                                           as action_date,
        RANK() OVER (PARTITION BY USERS ORDER BY ACTION_DATE ASC)                             as row_number,
        timestampdiff('minutes', action_date, LAG(action_date) OVER (PARTITION BY users ORDER BY action_date)) AS minutes_interval,
        timestampdiff('seconds', action_date, LAG(action_date) OVER (PARTITION BY users ORDER BY action_date)) AS seconds_interval,
        timestampdiff('hours', action_date, LAG(action_date) OVER (PARTITION BY users ORDER BY action_date)) AS hours_interval
    from USERS
    ORDER BY 1, 2, 3;
    
    

    以上产生:

    +-----+-----------------------------+----------+----------------+----------------+--------------+
    |USERS|ACTION_DATE                  |ROW_NUMBER|MINUTES_INTERVAL|SECONDS_INTERVAL|HOURS_INTERVAL|
    +-----+-----------------------------+----------+----------------+----------------+--------------+
    |jen  |2020-01-01 01:00:00.000000000|1         |NULL            |NULL            |NULL          |
    |jen  |2020-01-02 01:00:00.000000000|2         |-1440           |-86400          |-24           |
    |jen  |2020-01-03 01:00:00.000000000|3         |-1440           |-86400          |-24           |
    |jen  |2020-01-04 01:00:00.000000000|4         |-1440           |-86400          |-24           |
    |simon|2020-01-01 01:00:00.000000000|1         |NULL            |NULL            |NULL          |
    |simon|2020-01-01 02:00:00.000000000|2         |-60             |-3600           |-1            |
    |simon|2020-01-02 01:00:00.000000000|3         |-1380           |-82800          |-23           |
    |simon|2020-01-02 02:00:00.000000000|4         |-60             |-3600           |-1            |
    |simon|2020-01-03 01:00:00.000000000|5         |-1380           |-82800          |-23           |
    |simon|2020-01-04 01:00:00.000000000|6         |-1440           |-86400          |-24           |
    +-----+-----------------------------+----------+----------------+----------------+--------------+
    

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2020-05-27
      • 2022-11-22
      相关资源
      最近更新 更多