如何在 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 中仅选择增量记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在时间戳字段中仅使用日期来选择记录?

如何在 Big Query 中复制 GA 字段访问

如何在选择查询(MySQL)中仅消除连续重复而不是所有重复?

Big Query:如何提取数据集的每个表创建时间?

如何使用计划查询刷新 Google Big Query 中的现有表?

如何从列中的多条记录中仅选择 3 条记录?