如何在 BIG QUERY 中仅选择增量记录
Posted
技术标签:
【中文标题】如何在 BIG QUERY 中仅选择增量记录【英文标题】:How to select only incremental records in BIG QUERY 【发布时间】:2018-12-11 17:59:54 【问题描述】:我的数据库中有如下数据
我期待这样的结果
谁能帮我写一个选择查询。这是一种数据的增量加载
请帮我解决这个问题
【问题讨论】:
【参考方案1】:您可以使用窗口函数。你想要每条记录的最早版本,所以:
select t.*
from (select t.*,
row_number() over (partition by empid, empname, sal order by create_time) as seqnum
from t
) t
where seqnum = 1;
如果你想检测变化,而不是一组值的第一次出现,你可以使用lag()
:
select t.*
from (select t.*,
lag(sal) over (partition by empid, empname order by create_time) as prev_sal
from t
) t
where prev_sal is null or prev_sal <> sal;
这可以处理减少和增加的工资。
【讨论】:
嗨,戈登,它给了我完整的数据,但我只期待新添加或修改的数据。如果您查看数据,每种颜色都代表一天的数据,它就像一张历史表 @kalyan4uonly 。 . .我懂了。job_process_id
不应在 partition by
中。
提示:当工资下降到以前的值之一时,情况如何:o)
@MikhailBerlyant 。 . .我认为该评论更适合question,而不是this answer。您正在寻求澄清 OP 的意图。
不,我的目的是给你一个提示,因为我相信这是关于更改而不是最早的版本【参考方案2】:
SQL SERVER 还是 ORACLE?
我在这里尝试 SQL SERVER 对于所有记录,获取员工最近的先前记录(如果有)并检查此后的更改,如果没有,请不要选择 - 因此,仅显示新的或更改的记录
SELECT t1.* FROM tab t1
OUTER APPLY
(SELECT TOP 1 t2.*
FROM tab t2
WHERE t1.empid = t2.empid
AND t2.create_time < t1.create_time
ORDER BY t2.create_time DESC
) IQ
WHERE IQ.empid IS NULL
OR IQ.ename != t1.ename
OR IQ.sal != t1.sal
【讨论】:
嗨,Cato,如何在 BIG QUERY 中写这个,你能帮帮我吗以上是关于如何在 BIG QUERY 中仅选择增量记录的主要内容,如果未能解决你的问题,请参考以下文章
如何在选择查询(MySQL)中仅消除连续重复而不是所有重复?