SQL SSMS - 查找并标记现有记录和标记

时间:2015-12-23 11:45:18

标签: sql sql-server ssms

我有2个表,结构如下:

表1:

Data_Details_Fk Date_Fk Entity_Fk   Scenario_Fk Value
60              3652    13          2           10
56              3652    11          2           81
58              3652    10          2           43
57              3652    12          3           79
59              3652    14          2           27
59              3652    10          2           49
59              3652    10          3           76
58              3652    10          3           35
56              3652    11          3           44
57              3652    11          2           40

表2:

Data_Details_Sk Rtype
60              PL
56              PL
58              BS
57              BS
59              CF

我有2个场景,即2个指实际,3个指预算。 我想在我的表中添加一个额外的列,表示对于考虑Data_Details_Fk, Date_Fk, Entity_Fk的方案2,3存在相同Rtype记录时带有1的标志行。

标记实体,datadetails上实际组合的所有预算(不是真的在DataDetails上,而是RType作为连接)。 Rtype基本上是为data_details_fk加载的PL,BS,CF的报告。

所需的输出是:

Data_Details_Fk Date_Fk Entity_Fk   Scenario_Fk Value   IsFlag
60              3652    13              2       10      0
56              3652    11              2       81      1
58              3652    10              2       43      1
57              3652    12              3       79      0
59              3652    14              2       27      0
59              3652    10              2       49      1
59              3652    10              3       76      1
58              3652    10              3       35      1
56              3652    11              3       44      1
57              3652    11              2       40      0

我有一个大尺寸表,想要优化查询,以便花费最少的时间来填充标记。

1 个答案:

答案 0 :(得分:1)

我意识到我对这个问题感到有些困惑。结果表明,当Scenario_FK同时包含0和1时,您希望将行标记为1。如果这是正确的,并且只允许2和3的值,那么一种方法是:

select t1.*,
       (case when min(Scenario_Fk) over (partition by Data_Details_Fk, Date_Fk, Entity_Fk) = 2 and
                  max(Scenario_Fk) over (partition by Data_Details_Fk, Date_Fk, Entity_Fk) = 3
             then 1 else 0
        end) as isFlag
from table1 t1;