我有数据,每周都会被重报。在下面的表格中,我收到了列Date, Product, Location, Rate, FlagA, and FlagB。FlagC是一个计算列,它将FlagA=1的记录标记为1,如果FlagB在未来的任何记录中被标记为1的话。同样地,我需要创建一个名为FlagC_Rate的计算列,这个计算列将FlagB=1的行的Rate列中的值拉出来(例如,本例中的0.06)。有什么想法,我应该写什么select语句来获得这个FlagC_Rate的值?我复制了我的FlagC列的代码作为参考。
CODE FOR CALCULATING FLAGC列。
Select (SUM(case when FlagB = 1 then 1 else null end) OVER(Partition by product, location))
* (case when FlagA = 1 then 1 else null end) as FlagC FROM Table
ATTEMPT for FLAGC_RATE.
Select (SUM(case when FlagB = 1 then 1 else null end) OVER(Partition by product, location))
* (case when FlagA = 1 then 1 else null end) * (case when FlagB = 1 then Rate else null end) as FLAGC_Rate FROM Table
示例数据和示例我如何尝试使用FLAGC_RATE。
一月份数据
Date Product Location Rate FlagA FlagB FlagC FlagC_Rate
Jan 2020 WidgetA X 0.05 1 0 0 NULL
2月数据(FlagC列得到重述和填充)。
Date Product Location Rate FlagA FlagB FlagC FlagC_Rate
Jan 2020 WidgetA X 0.05 1 0 1 0.06
Feb 2020 WidgetA X 0.06 0 1 0 NULL
3月数据(Flag C列为空,因为每个产品定位配对只会看到一条记录,该记录有FlagC和FlagC_Rate的值。
Date Product Location Rate FlagA FlagB FlagC FlagC_Rate
Jan 2020 WidgetA X 0.05 1 0 1 0.06
Feb 2020 WidgetA X 0.06 0 1 0 NULL
March 2020 WidgetA X 0.06 0 0 0 NULL
请尝试以下方法。
Select *
, SUM(case when FlagB = 1 then 1 else null end) OVER(Partition by product, location) * (case when FlagA = 1 then 1 else null end) as FlagC
, max(case when FlagB = 1 then Rate else null end) OVER(Partition by product, location) * (case when FlagA = 1 then 1 else null end) as FLAGC_Rate
from data_table
请看db<>fiddle。此处.