根据 sql (teradata) 中另一列的条件分配列值
Assigning column value based on condition on another column in sql (teradata)
我有一个 table,其中包含以下列:Date
、AcctId
、CustID
、BackupID
、Logins
、Amount
。对于给定的日期,AcctID
可以多于一个 CustIDs
,但我想根据 Logins
的值将单数 CustID
分配给 AcctID
.
即:
如果 Cust1
对于给定日期和 AcctID
的 Logins
多于 Cust2
,则 CustID
应该具有 Cust1
作为值。
如果 Cust1
登录 = Cust2
登录那么 CustID
应该有 BackupID
值。
然后我想为给定的 Date
、AcctID
添加 Amount
。
任何人都可以帮助逻辑吗?我试过自助加入,但可能没有想到正确的方式。
您可以使用聚合和 window 函数实施您的规则:
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
聚合数据。它还对给定 acct/date 组合的监护人进行排名。
外部查询然后说:
- 如果只有一个最大值
custid
,则使用那个。
- 否则使用
backupid
.
请注意,如果给定的 acctid
/date
组合有多个 backupid
,则使用任意一个。
我有一个 table,其中包含以下列:Date
、AcctId
、CustID
、BackupID
、Logins
、Amount
。对于给定的日期,AcctID
可以多于一个 CustIDs
,但我想根据 Logins
的值将单数 CustID
分配给 AcctID
.
即:
如果 Cust1
对于给定日期和 AcctID
的 Logins
多于 Cust2
,则 CustID
应该具有 Cust1
作为值。
如果 Cust1
登录 = Cust2
登录那么 CustID
应该有 BackupID
值。
然后我想为给定的 Date
、AcctID
添加 Amount
。
任何人都可以帮助逻辑吗?我试过自助加入,但可能没有想到正确的方式。
您可以使用聚合和 window 函数实施您的规则:
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
聚合数据。它还对给定 acct/date 组合的监护人进行排名。
外部查询然后说:
- 如果只有一个最大值
custid
,则使用那个。 - 否则使用
backupid
.
请注意,如果给定的 acctid
/date
组合有多个 backupid
,则使用任意一个。