【问题标题】:Assigning column value based on condition on another column in sql (teradata)根据sql(teradata)中另一列的条件分配列值
【发布时间】:2020-10-29 16:34:27
【问题描述】:

我有一个包含以下列的表:Date、AcctId、CustID、BackupID、Logins、Amount。对于给定的日期,AcctID 可以有多个CustIDs,但我想根据Logins 的值将单数CustID 分配给AcctID。


即:

如果Cust1 在给定日期和AcctID 中的Logins 比Cust2 多,那么CustID 的值应该是Cust1。

如果Cust1 logins = Cust2 logins 那么CustID 应该有BackupID 值。


然后我想为给定的Date、AcctID 添加Amount。

谁能帮忙分析一下逻辑?我尝试了自我加入,但可能没有以正确的方式思考。

【问题讨论】:

  • 棘手的部分是如果 Cust1 logins = Cust2 logins 那么 CustID 应该有 BackupID 值。如果 all CustID per Date/AcctId 显示相同的登录次数,那么使用 BackupId? Acct_Id 和 BackupId 之间是否存在 1-1 关系?
  • 在这种情况下应该添加多少数量?
  • 样本数据和期望的结果会有所帮助。哪个备份ID?总是一样吗?

标签: sql teradata self-join teradata-sql-assistant


【解决方案1】:

您可以使用聚合和窗口函数来实现您的规则:

select acctid, date,
       (case when count(*) = 1 then min(custid)
             else min(backupid)
        end) as imputed_customer
from (select acctid, date, min(backupid) as backupid, custid,
             count(*) as cnt,
             rank() over (partition by acctid, date order by count(*) desc) as seqnum
      from t
      group by acctid, date
     ) ad
where seqnum = 1
group by acctid, date;

子查询按acctid、date 和custid 聚合数据。它还对给定帐户/日期组合的 custid 进行排名。

然后外部查询说:

  • 如果最多只有一个custid,则使用它。
  • 否则使用backupid。

请注意,如果给定acctid/date 组合中有多个backupid,则使用任意一个。

【讨论】:

  • 谢谢林诺夫。这解决了问题。是否将 sum(login) 而不是 count(*) 替换为基于每个 cust_id 登录的决策?
猜你喜欢
  • 1970-01-01
  • 2023-02-15
  • 2018-01-02
  • 1970-01-01
  • 2017-12-18
  • 2016-04-15
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
相关资源
最近更新 更多