计算列,有没有比我的子查询更好的方法

Posted

技术标签:

【中文标题】计算列,有没有比我的子查询更好的方法【英文标题】:Compute columns, are there any better ways than my subquery 【发布时间】:2018-08-16 02:52:31 【问题描述】:

我在尝试计算列时遇到了一些麻烦

DF1

Date         transaction_number  tender_amt   tender_type
2017-01-01   001                 20           euros
2017-01-01   001                 10           american
2017-01-01   002                 20           american
2017-01-02   001                 40           american
2017-01-01   003                 40           euros
2017-01-01   004                 50           american

如何创建一个计算列,根据交易编号和日期将tender_amt 与欧元/美国分开?

DF-Desired

Date         transaction_number  tender_amt   tender_type     exchange_rate(euro/american)  
2017-01-01   001                 20           euros            2              
2017-01-01   001                 10           american         2
2017-01-01   002                 20           american         (null)       
2017-01-02   001                 40           american         (null)
2017-01-01   003                 40           euros            (null)
2017-01-01   004                 50           american         (null)

我的尝试

Select Date, transaction_number, tender_amt, tender_type, 
exchange_rate = (Select O.tender_amt / B.tender_amt as exchange_rate
From df1 O
Inner Join df1 as B on B.Date = O.Date and B.transaction_number = O.transaction_number
where  O.transaction_number = a.transaction_number 
and O.Date = a.Date and O.tender_type = 'euro' and B.tender_type = 'american'
)
from df1 a

有没有更好的方法?

【问题讨论】:

用您真正使用的数据库标记您的问题,mysql 还是 SQL Server? 【参考方案1】:

让我假设 SQL Server。您可以使用窗口函数:

select df1.*,
       (max(case when tender_type = 'euros' then tender_amt end) over (partition by Date, transaction_number) /
        max(case when tender_type = 'american' then tender_amt end) over (partition by Date, transaction_number)
       ) as exchange_rate       
from df1;

【讨论】:

以上是关于计算列,有没有比我的子查询更好的方法的主要内容,如果未能解决你的问题,请参考以下文章

应该是独立的子查询不是。为啥?

SQl 查询中哪个更好的子查询或联接?

试图从 2 个正在加入的子查询中获取一列并且分组不起作用

子查询分解问题

子选择或连接?有没有更好的方法来编写这个 mysql 查询?

SQL Server 中的树结构数据查询