BI-SQL丨MEGRE

MEGRE

MEGRE语句,在SQL的生态圈中,一直都隶属于一个比较重要的位置。

要知道,在实际的项目应用中,我们经常需要从上游数据源,进行原始数据的抽取、清洗、存储、分析等操作,特别是在存储这一环节,MEGRE的作用尤为突出。

举个例子:

我们需要完成对上游维度信息的抽取,根据我们的设定,数仓在每日执行抽取任务之前,需要对数仓已有的维度信息进行判断,如果已有的,要核对是否与最新的数据相匹配,不匹配则进行更新操作;如果是没有的,则需要执行插入操作。

常规的实现方法需要分别编写SQL语句进行条件判断,分别执行更新和插入操作,这样会显得代码非常的臃肿,性能也不是特别好,针对这种情况,使用MEGRE语句尤为的适合。

函数介绍

MEGRE语法如下:

MERGE 目标表
USING 源表
ON 匹配条件
WHEN MATCHED
THEN 语句
WHEN NOT MATCHED BY TARGET --如何和目标表不匹配
THEN 语句
WHEN NOT MATCHED BY SOURCE --如何和源表不匹配
THEN 语句;

注意:

1.最后语句的分号不可以被省略;

2.源表可以是一个物理表,也可以是一个子查询语句。

使用实例

案例数据:

在白茶本机的数据库中,存在名为”CaseData”的数据库,执行下面的语句,生成我们需要的源表和目标表。

CREATE TABLE TargetTable (
    UserID INT PRIMARY KEY,
    UserName VARCHAR(255) NOT NULL,
    Amount DECIMAL(10, 2)
);
INSERT INTO TargetTable(UserID, UserName, Amount)
VALUES(1, '张三', 15000),
      (2, '李四', 25000),
      (3, '王五', 13000),
      (4, '陈六', 10000);
--------------上面生成目标表,下面生成源表--------------
CREATE TABLE SourceTable (
    UserID INT PRIMARY KEY,
    UserName VARCHAR(255) NOT NULL,
    Amount DECIMAL(10, 2)
);
INSERT INTO SourceTable(UserID, UserName, Amount)
VALUES(1, '张三', 15000),
      (3, '王五', 14000),
      (4, '陈六', 20000),
      (5, '赵七', 10000),
      (6, '钱九', 10000);

结果如下:

我们来查看一下表的数据。

假设TargetTable表是数仓目前已有的数据,SourceTable表是每日更新的上游数据,我们现在要根据SourceTable表对TargetTable进行数据更新。

更新规则如下:

1.若TargetTable表和SourceTable表都有的数据,则需要更新为SourceTable表中的记录;

2.若TargetTable表有的记录,且SourceTable表没有,则这些记录需要被清除掉;

3.若TargetTable表没有记录,且SourceTable表有,则需要将SourceTable表中的记录插入到TargetTable表中。

根据上述要求,我们可以编辑如下SQL语句:

MERGE TargetTable
USING SourceTable
ON (TargetTable.UserID = SourceTable.UserID)
WHEN MATCHED THEN
UPDATE
SET TargetTable.UserName = SourceTable.UserName,
    TargetTable.Amount = SourceTable.Amount
WHEN NOT MATCHED BY TARGET THEN
INSERT (UserID, UserName, Amount)
VALUES (
        SourceTable.UserID,
        SourceTable.UserName,
        SourceTable.Amount
    )
WHEN NOT MATCHED BY SOURCE THEN 
DELETE;

结果如下:

在这里插入图片描述

在这里插入图片描述

这里是白茶,一个PowerBI的初学者。

在pandas中,merge函数用于合并两个DataFrame。首先,创建两个DataFrame: df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(5)}) df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(5)}) 基于指定列进行连接,可以使用merge函数并指定on参数为连接的列名: df3 = pd.merge(df1,df2,on='name') 内连接(inner)是merge合并的默认情况,它只保留两个DataFrame中键的交集。使用merge函数并指定how参数为'inner'即可实现内连接: df3 = pd.merge(df1,df2,how='inner') 左连接(left)是以第一个DataFrame为主进行连接,第二个DataFrame作为补充。使用merge函数并指定how参数为'left'即可实现左连接: df3 = pd.merge(df1,df2,how='left') 右连接(right)是以第二个DataFrame为主进行连接,第一个DataFrame作为补充。使用merge函数并指定how参数为'right'即可实现右连接: df3 = pd.merge(df1,df2,how='right') 外连接(outer)相当于求两个DataFrame的并集。使用merge函数并指定how参数为'outer'即可实现外连接: df3 = pd.merge(df1,df2,how='outer') 通过使用不同的how参数,你可以根据自己的需求选择合适的连接方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pandas的merge方法详解](https://blog.youkuaiyun.com/trayvontang/article/details/103787648)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [pandas数据表合并](https://blog.youkuaiyun.com/baidu_41797613/article/details/120316920)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fabric丨白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值