sql - 检测今天和昨天的帐户/负载之间差异的查询
问题描述
目标:检测昨天的表负载和今天的负载之间的任何差异。每次加载都会加载与银行帐户关联的数据值。所以我需要一个查询来返回每个有差异的个人帐户,其值在列名中。
我需要来自两个不同表的几列的数据。AEI_GFXAccounts 和 AEI_GFXAccountSTP。每次加载表时,它都有一个递增 1 的“run_ID”。所以需要与MAX(run_id)
和进行比较MAX(run_id) -1
。
我尝试了以下查询。这个查询所做的就是返回我需要的所有列。我现在需要实现运行这些查询的逻辑WHERE runID = MAX(runID)
。然后在哪里再次运行它run_ID = Max(runID) -1
。比较这两个表,显示可以显示在类似列下的差异SELECT AccountBranch WHERE MAX(Run_ID) -1 AS WAS
。等,以及每个列的另一个自定义命名列为 ' IS NOW
' 等。
SELECT AEI_GFXAccounts.AccountNumber,
AccountBranch,
AccountName,
AccountType,
CostCenter,
TransactionLimit,
ClientName,
DailyCumulativeLimit
FROM AEI_GFXAccounts
JOIN AEI_GFXAccountSTP
ON (AEI_GFXAccounts.feed_id = AEI_GFXAccountSTP.feed_id
and AEI_GFXAccounts.run_id = AEI_GFXAccountSTP.run_id)
解决方案
我使用与此类似的东西来检测日志系统的更改:
WITH data AS (
SELECT
a.run_id,
a.AccountNumber,
?.AccountBranch,
?.AccountName,
?.AccountType,
?.CostCenter,
?.TransactionLimit,
?.ClientName,
?.DailyCumulativeLimit
FROM
AEI_GFXAccounts a
INNER JOIN AEI_GFXAccountSTP b
ON
a.feed_id = b.feed_id and
a.run_id = b.run_id
),
yest AS (
SELECT * FROM data WHERE run_id = (SELECT MAX(run_id)-1 FROM AEI_GFXAccounts)
),
toda AS (
SELECT * FROM data WHERE run_id = (SELECT MAX(run_id) FROM AEI_GFXAccounts)
)
SELECT
CASE WHEN COALESCE(yest.AccountBranch, 'x') <> COALESCE(toda.AccountBranch, 'x') THEN yest.AccountBranch END as yest_AccountBranch,
CASE WHEN COALESCE(yest.AccountBranch, 'x') <> COALESCE(toda.AccountBranch, 'x') THEN toda.AccountBranch END as toda_AccountBranch,
CASE WHEN COALESCE(yest.AccountName, 'x') <> COALESCE(toda.AccountName, 'x') THEN yest.AccountName END as yest_AccountName,
CASE WHEN COALESCE(yest.AccountName, 'x') <> COALESCE(toda.AccountName, 'x') THEN toda.AccountName END as toda_AccountName,
...
FROM
toda INNER JOIN yest ON toda.accountNumber = yestaccountNumber
笔记:
- 您没有说您的某些列来自哪个表。我在它们前面加上- 分别用or
?.
替换它们(完全限定所有列别名的好习惯)a.
as.
- 当您在底部选择(上方...)中重复模式时,选择不会出现在列中的 COALESCE 数据。我使用 COALESCE 作为避免写入的快速方法
CASE WHEN a is null and b is not null or b is null and a is not null or a != b
,但是如果 accountname(例如)是'x'
昨天而今天它为 null,则比较失败,因为 null 变为“x”。如果您选择永远不会出现在列中的数据,那么检查将成功,因为空值将被合并到永远不会出现在真实数据中的东西,因此<>
比较会成功 - 如果您不在乎某列今天何时从昨天的值变为 null,或者昨天为 null 但今天是一个值,您可以放弃合并并从字面上执行
toda.X <> yest.X
- 今天的新帐户要到明天才会显示。如果您希望他们出现,请执行此操作
toda LEFT JOIN yest ...
。当然,它们的所有属性都将显示为新属性;) - 无论是否进行了任何更改,此查询都会返回所有帐户。如果您只想要一个有更改的帐户列表,则需要一个与您的案例 whens 类似的 where 子句:
WHERE
COALESCE(toda.AccountBranch, 'x') <> COALESCE(yest.AccountBranch, 'x') OR
COALESCE(toda.AccountName, 'x') <> COALESCE(yest.AccountName, 'x') OR
...
推荐阅读
- google-bigquery - 语法错误:应为“)”,但在 [62:23] 获得标识符“ciclos”
- c++ - 将 NORMAL 添加到 inputLayout 时出错
- task - 工作流无法启动,因为没有在工作流任务列表中插入记录
- reactjs - 如何使用 ansbile 为 nginx 构建 reactjs 文件,然后将这些文件同步到 ansible 库存?
- oracle - Oracle 插入选择不给出 GROUP BY 表达式
- google-app-engine - 如何使用 nuxtjs 配置 vuetify 以在 Google App Engine 上部署
- json - 使用高阶函数从帐户中提取联系人帐户显示名称
- kubernetes - Kubernetes中的入口是否占用节点的端口
- c# - 如何让 VS 使用本地构建的 ASP.NET Core?
- r - R 函数无法更改多个数据集的列名