将特定日期的数据连接到每日时间序列(Teradata SQL)
我很难在标题中总结出我想要做的事情,但是我举的例子应该是有意义的。我正在尝试用Teradata编写一个更高效的查询,该查询将在Tableau中使用。我可以用蛮力和无知的方法来完成它,但过了一段时间,我用完了假脱机空间,所以我需要使它更有效 假设我有两个表,一个带有customer属性的customer表和一个daily balance表(它比这更复杂,但这是重要的部分)。我想编写一个查询,返回每个客户的每日余额以及其他列,这些列是该客户的特定天数余额,而不考虑最终表中的日期字段 例如: 客户表将特定日期的数据连接到每日时间序列(Teradata SQL),sql,teradata,Sql,Teradata,我很难在标题中总结出我想要做的事情,但是我举的例子应该是有意义的。我正在尝试用Teradata编写一个更高效的查询,该查询将在Tableau中使用。我可以用蛮力和无知的方法来完成它,但过了一段时间,我用完了假脱机空间,所以我需要使它更有效 假设我有两个表,一个带有customer属性的customer表和一个daily balance表(它比这更复杂,但这是重要的部分)。我想编写一个查询,返回每个客户的每日余额以及其他列,这些列是该客户的特定天数余额,而不考虑最终表中的日期字段 例如: 客户表
CustID | CustState | CustType | ...
001 | NY | A | ...
002 | CA | B | ...
003 | NC | C | ...
平衡表
CustID | Date | Balance
001 |04/01/2018 | 100
001 |04/02/2018 | 105
001 |04/03/2018 | 110
002 |04/01/2018 | 5000
002 |04/02/2018 | 15000
002 |04/03/2018 | 25
最终查询结果
CustID | CustState | Date | Balance | Balance42 | Balance43
001 | NY |04/01/2018 | 100 | 105 | 110
001 | NY |04/02/2018 | 105 | 105 | 110
001 | NY |04/03/2018 | 110 | 105 | 110
002 | CA |04/01/2018 | 5000 | 1500 | 25
002 | CA |04/02/2018 | 15000 | 1500 | 25
002 | CA |04/03/2018 | 25 | 1500 | 25
如您所见,前四列是直截了当的,后两列分别代表2018年4月2日和2018年4月3日的余额。我目前的做法如下所示,我使用多个联接/子查询来获取特定余额:
select a.CustID
, a.CustState
, b.Date
, sum(b.Balance) as Balance
, c.Balance as Balance42
, d.Balance as Balance43
from Customer a
inner join Balance b on a.CustID=b.CustID
inner join (
select aa.CustID
, sum(bb.Balance) as Balance
from Customer aa
inner join Balance bb on aa.CustID=bb.CustID
where aa.CustType in ('A','B')
and bb.Date=DATE '2018-04-02
group by aa.CustID
) c on a.CustID=c.CustID
inner join (
select aa.CustID
, sum(bb.Balance) as Balance
from Customer aa
inner join Balance bb on aa.CustID=bb.CustID
where aa.CustType in ('A','B')
and bb.Date=DATE '2018-04-03
group by aa.CustID
) d on a.CustID=c.CustID
where a.CustType in ('A','B')
group by a.CustID
, a.CustState
, b.Date
, c.Balance
, d.Balance
有没有一种方法可以只使用一个联接/子查询来提高效率?当我添加了太多的联接/子查询时,我开始用尽假脱机空间,但我有一个特定的业务用途来解释为什么我要尝试获取最终结果结构。我不确定我是否完全理解您要做的事情。但似乎您应该能够在一个语句中完成,在最后两个计算中使用case语句:
select a.CustID
, a.CustState
, b.Date
, sum(b.Balance) as Balance
, sum (case when b.date = '2018-04-02' then b.balance else null end) as balance42
, sum (case when b.date = '2018-04-03' then b.balance else null end) as balance 43
from Customer a
inner join Balance b on a.CustID=b.CustID
我不确定我完全明白你想做什么。但似乎您应该能够在一个语句中完成,在最后两个计算中使用case语句:
select a.CustID
, a.CustState
, b.Date
, sum(b.Balance) as Balance
, sum (case when b.date = '2018-04-02' then b.balance else null end) as balance42
, sum (case when b.date = '2018-04-03' then b.balance else null end) as balance 43
from Customer a
inner join Balance b on a.CustID=b.CustID
您需要条件agregion,但在您的情况下,它基于窗口聚合:
您需要条件agregion,但在您的情况下,它基于窗口聚合:
无OLAP的替代查询(仅当Customer.CustID为PK时有效)
无OLAP的替代查询(仅当Customer.CustID为PK时有效)
在第四行中,您已经有了4/1、4/2和4/3的余额。您在最后两列中复制它有什么原因吗?如果没有,删除这两个选项是否可以接受,或者删除包含重复数据的额外行?我正在复制该数据,因为当我在Tableau中提取数据时,它将允许我轻松地将这些特定日期的余额与其他日期的余额进行比较。在第四行中,您已经有了4/1、4/2和4/3的余额。您在最后两列中复制它有什么原因吗?如果没有,是否可以删除这两个选项或删除包含重复数据的额外行?我正在复制该数据,因为当我在Tableau中提取数据时,它将允许我轻松地将这些特定日期的余额与其他日期的余额进行比较。当我这样做时,它不会从每个日期的4/2填充余额,仅当日期等于4/2时。有没有一种方法可以使每行的余额与日期字段无关?当我这样做时,它不会为每个日期填充从4/2开始的余额,只有当日期等于4/2时。有没有一种方法可以让每一行都保持平衡,而不考虑日期字段?太好了,非常感谢你的帮助,我知道这必须是我没有想到的简单的事情,这就解决了。太好了,非常感谢你的帮助,我知道这必须是我没有想到的简单的事情,这就解决了。
with x as (
select a.CustID
, a.CustState
, b.Date
, sum(b.Balance) as Balance
from Customer a
inner join Balance b on a.CustID=b.CustID
where a.CustType in ('A','B')
group by a.CustID
, a.CustState
, b.Date
)
select x.CustID
, x.CustState
, x.Date
, x.Balance
, d1.Balance as Balance42
, d2.Balance as Balance43
from x
inner join x d1 when d1.CustID = x.CustID and d1.Date=DATE '2018-04-02'
inner join x d2 when d2.CustID = x.CustID and d2.Date=DATE '2018-04-03'