【问题标题】:How to use the datebucket filter如何使用日期桶过滤器
【发布时间】:2022-10-20 16:43:29
【问题描述】:

尝试使用 :datebucket 过滤器,但它似乎不起作用。

select date, address from database.table where address = 'xyz' group by :datebucket(date)

这将返回 date 不在 group by 语句中的错误,但它是。如果将其单独添加到 group by 语句中,它只会按单个日期分组,而不是尊重日期桶选择。

在 Snowflake 文档中没有找到任何关于这个过滤器应该如何工作的东西,只是它存在。

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    在这个网站上:https://www.webagesolutions.com/blog/querying-data-in-snowflake 是这样的关于数据桶功能的例子

    SELECT COUNT(ORDER_DATE) as COUNT_ORDER_DATE, ORDER_DATE 
    FROM ORDERS 
    GROUP BY :datebucket(ORDER_DATE), ORDER_DATE 
    ORDER BY COUNT_ORDER_DATE DESC; 
    

    如果这样修改,您的查询也可以工作:

    SELECT 
      date, 
      address 
    FROM
      database.table 
    WHERE 
      address = 'xyz' 
    GROUP BY :datebucket(date), date
    
    
    

    【讨论】:

      【解决方案2】:

      Datebucket 将日期截断为桶。但是您选择了原始日期。

      这就像按十年“60”、“70”、“80”分组,但要实际年份。

      SELECT column1 as year,
          truncate(year,-1) as decade
      FROM VALUES (1),(2),(3),(14),(15),(16),(27),(28),(29);
      

      给出:

      YEAR DECADE
      1 0
      2 0
      3 0
      14 10
      15 10
      16 10
      27 20
      28 20
      29 20

      所以如果我尝试选择

      SELECT column1 as year
      FROM VALUES (1),(2),(3),(14),(15),(16),(27),(28),(29)
      GROUP BY truncate(year,-1)
      ORDER BY 1;
      

      给出错误

      错误:select 子句中的“VALUES.COLUMN1”既不是聚合也不是 group by 子句。 (第 15 行)

      因此,如果我们将十年移入选择中,这是有道理的:

      SELECT truncate(column1,-1) as decade
      FROM VALUES (1),(2),(3),(14),(15),(16),(27),(28),(29)
      GROUP BY decade
      ORDER BY 1;
      

      我们得到

      DECADE
      0
      10
      20

      所以问题不在于:datebucket(date),而是:datebucket(date)date 相关的事实,从GROUPING 的角度来看它们是不相关的。

      【讨论】:

        【解决方案3】:

        我一直在尝试使用日期桶(日期)日期范围,我还需要雪花图中的结果。

        这有点技巧,因为 datebucket(date) 返回的值实际上是基于所选日期部分的截断日期。为此,我必须将其转换为字符,并且成功了!

        select 
           to_char(:datebucket(start_time), 'YYYY.MM.DD @ HH24') as start_time_bucket, 
           sum(credits_used) as credits_used
        from snowflake.account_usage.warehouse_metering_history wmh 
        where 
            start_time = :daterange
        group by :datebucket(start_time)
        

        如果您是 ACCOUNTADMIN,您现在可以使用查询来获取按日期使用的总积分 :)


        最后,要回答 Tony 的主要问题,问题应该是:

        select date, address 
        from database.table 
        where address = 'xyz' 
        group by :datebucket(date), date, address
        
        // or
        
        select :datebucket(date), address 
        from database.table 
        where address = 'xyz' 
        group by :datebucket(date), address
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-06
          • 1970-01-01
          • 1970-01-01
          • 2020-04-27
          相关资源
          最近更新 更多