更新select查询中的列值

wfveoks0  于 2021-06-26  发布在  Impala
关注(0)|答案(3)|浏览(340)

我有一个复杂的sql问题。
我们可以在select查询中更新列吗?例子:
考虑下这张表:

|ID   |SeenAt  |
    ----------------
    |1    |20      |
    |1    |21      |
    |1    |22      |
    |2    |70      |
    |2    |80      |

我想要一个select查询,它给出每个id第一次出现的时间。什么时候又看到了

|ID   |Start  |End  |
    ---------------------
    |1    |20     |21   |
    |1    |20     |22   |
    |1    |20     |22   |
    |2    |70     |80   |
    |2    |70     |80   |

首先,两列 Start 以及 End 将具有相同的值,但当第二行具有相同的 ID 我们需要更新它的前身 End 新的 SeenAt 价值观。我成功地创造了 Start 列,我给出最小值 SeenAt 每小时价值 ID 所有ID。但我找不到办法更新 End 每次都是列。
别介意双倍,我还有其他列,每一行都会改变
此外,我在 Impala 工作,但我可以使用甲骨文。
我希望我已经说得够清楚了。谢谢您

tkclm6bt

tkclm6bt1#

你似乎需要 min() 解析函数 self-join :

select distinct t1.ID,
       min(t1.SeenAt) over (partition by t1.ID order by t1.ID) as "Start",
       t2.SeenAt as "End"
  from tab t1
  join tab t2 on t1.ID=t2.ID and t1.SeenAt<=t2.SeenAt
 order by t2.SeenAt;

演示

w6mmgewl

w6mmgewl2#

你可以用 lead() 以及 nvl() :

select id, min(seenat) over (partition by id) seen_start,
       nvl(lead(seenat) over (partition by id order by seenat), seenat) seen_end
  from t

演示

xyhw6mcr

xyhw6mcr3#

开始很容易 MINGROUP 结束后你需要找到最小值 SeenAt 如果你找不到,那么电流 SeenAt sql演示

SELECT "ID", 
        (SELECT MIN("SeenAt")
         FROM Table1 t2
         WHERE t1."ID" = t2."ID") as "Start",
        COALESCE(
                 (SELECT MIN("SeenAt")
                  FROM Table1 t2
                  WHERE t1."ID" = t2."ID"
                  AND t1."SeenAt" < t2."SeenAt")
                 , t1."SeenAt"
                ) as End

FROM Table1 t1

输出

| ID | START | END |
|----|-------|-----|
|  1 |    20 |  21 |
|  1 |    20 |  22 |
|  1 |    20 |  22 |
|  2 |    70 |  80 |
|  2 |    70 |  80 |

相关问题