【问题标题】:How to get max status as a column?如何获得作为列的最大状态?
【发布时间】:2022-01-01 05:55:27
【问题描述】:

我想创建一个列,根据created_at 显示最大order_status 是TRUE 还是FALSE。

有没有办法在 Snowflake 中不使用子查询来实现这一点?

这是我的示例数据:

    WITH t1 AS (
SELECT 'A' AS id, 'created' AS status, '2021-05-18 18:30:00'::timestamp AS created_at UNION ALL
SELECT 'A' AS id, 'created' AS status, '2021-05-19 11:30:00'::timestamp AS created_at UNION ALL
SELECT 'A' AS id, 'pending' AS status, '2021-05-19 12:00:00'::timestamp AS created_at UNION ALL
SELECT 'A' AS id, 'successful' AS status, '2021-05-20 18:30:00'::timestamp AS created_at
    )

【问题讨论】:

    标签: sql snowflake-cloud-data-platform window-functions


    【解决方案1】:

    使用窗口化 MAX:

    WITH t1(id, status, created_at) AS (
      SELECT 'A', 'created', '2021-05-18 18:30:00'::timestamp UNION ALL
      SELECT 'A', 'created', '2021-05-19 11:30:00'::timestamp UNION ALL
      SELECT 'A', 'pending', '2021-05-19 12:00:00'::timestamp UNION ALL
      SELECT 'A', 'successful', '2021-05-20 18:30:00'::timestamp AS created_at
    )
    SELECT *, created_at = MAX(created_at) OVER(PARTITION BY ID) AS is_final_order_status
    FROM t1;
    

    输出:

    【讨论】:

      【解决方案2】:

      大小写的 row_number 可以工作

      SELECT id, status, created_at
      , CASE 
        WHEN 1 = ROW_NUMBER() OVER (PARTITION BY id ORDER BY created_at DESC) 
        THEN 'TRUE' 
        ELSE 'FALSE'
        END is_final_order_status
      FROM t1
      

      【讨论】:

      • 删除 case 语句可能会使其更简单、更快。 select * ,1 = ROW_NUMBER() OVER (PARTITION BY id ORDER BY created_at DESC) is_final_order_status from t1
      • @AdrianWhite 但是在 Snowflake 中会很好看吗?
      • “一切都应该尽可能简单,但不能简单。” - 一些聪明的窥视者曾经说过这个
      • “科学家是个可怜的哲学家。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多