按唯一键分区,用case设置标志

时间:2018-04-04 09:18:20

标签: sql oracle case

我试图通过策略no拆分一组数据,并根据一组条件设置一个标志,并且我遇到了逻辑问题。

数据如下:

Policy_no, role  
1 , 'Owner'  
1 , 'Beneficiary'  
1 , 'Beneficiary'
2 , 'Owner'
2 , 'Life assured'
3 , 'Life assured'  

所以我试图通过policy_no分割数据,这样如果有所有者,则标志设置为' 1'但是如果没有所有者,则设置标志如果life_assured存在,但旗帜不能是' y'对于所有者和life_assured。

IE:

Policy_no, role, flag  
1 , 'Owner'          ,1  
1 , 'Beneficiary'    ,0  
1 , 'Beneficiary'    ,0
2 , 'Owner'          ,1
2 , 'Life assured 1' ,0
3 , 'Life assured 1' ,1
3 , 'Life assured 2' ,1 
4 , 'Beneficiary'    ,0 

我将标题设置为按唯一键分区,因为这是我正在尝试的内容,但目前无济于事。然而,我愿意接受新的想法。

编辑:抱歉,这是针对oracle dbms的。 编辑2:添加更多数据以展示不同的可能性。

由于

2 个答案:

答案 0 :(得分:0)

使用Oracle

SELECT Policy_no,
   role,
   CASE WHEN RN = 1 THEN
         1
   ELSE
         0
   END AS FLAG
FROM
  (
   SELECT Policy_no,
          role,
          Row_Number() Over (Partition BY Policy_no Order BY Policy_no) AS RN 
    FROM table1
  )

DEMO For Oracle

  

http://sqlfiddle.com/#!4/8561a/20

使用MYSQL

SELECT Policy_no
     , role
     , FLAG  
FROM
(
  SELECT Policy_no
         , role
         , CASE WHEN @Policy_no != T.Policy_no 
                THEN 1
                ELSE 0
            END AS FLAG
          ,@Policy_no := T.Policy_no AS VarPolicy_no
    FROM   Table1 AS T,(SELECT @Row :=null,@Policy_no := -1) AS R
)AS T1

<强>输出

Policy_no   role           FLAG
1           Owner           1
1           Beneficiary     0
1           Beneficiary     0
2           Owner           1
3           Life assured    1

MYSQL演示

  

http://sqlfiddle.com/#!18/800a9/3

答案 1 :(得分:0)

我在我的演示中添加了一些数据来测试所有规则:

  SELECT Policy_no
         , role
         , IIF(CASE
                   WHEN role = 'owner' THEN 1
                   WHEN role = 'Life assured' THEN 1
                   ELSE 0
                 END = 1
                 AND SUM(CASE
                           WHEN role = 'owner' THEN 1
                           WHEN role = 'Life assured' THEN 1
                           ELSE 0
                         END)
                       OVER (
                         Partition BY Policy_no ) < 2, 1, IIF(role = 'owner', 1, 0)) flag
    FROM   cte
    ORDER  BY Policy_no

SQL Server演示:http://sqlfiddle.com/#!18/9eecb/11009