如何解决Teradata 从多行获取变量的值
我有以下不同日期的日期和金额变量。根据日期的最小值,我只需要每个 ID 一行。
我拥有的数据:
ID Date Code Amt
101 2/1/2018 A90 25
101 2/2/2018 B90 15
101 2/5/2018 A90 25
102 2/1/2018 B90 10
我想要的数据:
ID A90_Date B90_Date A90_Amt B90_Amt
101 2/1/2018 2/2/2018 25 15
102 2/1/2018 10
我的查询:
Select ID,min(case when Code='A90' then Date else Null end) as A90_Date,min(case when Code='B90' then Date else Null end) as B90_Date,min(case when Code='A90' then Amt else Null end) as A90_Amt,min(case when Code='B90' then Amt else Null end) as B90_Amt
from Table
group by 1
虽然这给了我日期和金额值,但我担心它们是否准确,来自超过 1MM 的记录。是否有一种有效的方法可以使用 Qualify
中的 Partition
/Teradata
语句提取这些数据?
提前感谢您的帮助。
解决方法
如果相同 ID/代码的金额不同,您可能会得到错误的结果。然后你必须在聚合之前过滤最早的日期,例如
with cte as
(
Select ID,Code,Date,Amt
from Table
qualify row_number() over (partition by ID,Code order by date) = 1
)
Select ID,min(case when Code='A90' then Date end) as A90_Date,min(case when Code='B90' then Date end) as B90_Date,min(case when Code='A90' then Amt end) as A90_Amt,min(case when Code='B90' then Amt end) as B90_Amt
from cte
group by 1
根据您的数据,这可能更有效:
Select DISTINCT ID,first_value(case when Code='A90' then Date end) over (partition by ID order by date) as A90_Date,first_value(case when Code='B90' then Date end) over (partition by ID order by date) as B90_Date,first_value(case when Code='A90' then Amt end) over (partition by ID order by date) as A90_Amt,first_value(case when Code='B90' then Amt end) over (partition by ID order by date) as B90_Amt
from Table
group by 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。