【问题标题】:Display Prev and Current value based on a ID - SQL根据 ID 显示 Prev 和 Current 值 - SQL
【发布时间】:2019-11-15 20:21:40
【问题描述】:

我不确定是否有人发布了类似的问题。我找不到一个。

我有下表:

我想得到的是以下内容:

任何建议将不胜感激。

提前致谢, 山姆

【问题讨论】:

  • 如果id为1234有3条记录,结果会是什么?
  • 如果有 3 条记录,则显示第一条为 Prev1,第二条为 Prev2,第三条为当前。
  • @PamPetronas 你是说每个 ID 的记录越多,输出中的列越多?
  • 是的,汉斯。没错。

标签: sql snowflake-cloud-data-platform


【解决方案1】:

曾在 Oracle 和 Snowflake 工作过:

SELECT t.ID,
    t.prev_dt,
    t.current_dt,
    t.prev_code,
    t.curr_code 
FROM (
    SELECT id,
        order_dt,
        LAG(order_dt, 1) OVER (PARTITION by id ORDER BY id, order_dt) prev_dt,
        upd_dt current_dt,
        LAG(code, 1) OVER (PARTITION by id ORDER BY id, upd_dt) prev_code,
        code curr_code
    FROM t111
) t 
INNER JOIN (
    SELECT id,
        MAX(order_dt) max_date 
    FROM t111 
    GROUP BY id
) idm
  ON idm.id=t.id AND t.order_dt=idm.max_date

【讨论】:

    【解决方案2】:

    你似乎想要窗口函数lag():

    select 
        id,
        lag(order_dt) over(partition by id order by order_by_id) prev_dt,
        order_dt current_dt,
        lag(code) over(partition by id order by order_by_id) prev_code,
        code curr_code
    from mytable
    

    请注意,上面的查询不会过滤表的记录。当没有前面的记录时,lag() 返回null。如果您想过滤掉每组的第一条记录,并假设该记录由order_by_id = 1 标识,您可以这样做:

    select *
    from (
        select 
            id,
            lag(order_dt) over(partition by id order by order_by_id) prev_dt,
            order_dt current_dt,
            lag(code) over(partition by id order by order_by_id) prev_code,
            code curr_code,
            order_by_id
        from mytable
    ) t
    where order_by_id > 1
    

    【讨论】:

    • 欢迎@PamPetronas!如果我的回答正确回答了您的问题,请点击上方箭头和绿色复选标志upvote and accept it...谢谢!
    【解决方案3】:

    窗口函数可能是最好的方法。但你也可以使用join:

    select t1.id, t1.order_dt as prev_dt, t2.upd_dt as curr_date,
           t1.code as prev_code, t2.code as curr_code
    from t t1 join
         t t2
         on t1.id = t2.id and t1.order_by_id = 1 and t2.order_by_id = 2;
    

    在 Snowflake 中,我根本不知道这是否会比使用窗口函数具有更好、更差或类似的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多