Sql 按唯一键分区,用大小写设置标志

Sql 按唯一键分区,用大小写设置标志,sql,oracle,case,Sql,Oracle,Case,我试图用策略no分割出一组数据,并根据一组条件设置一个标志,但我在逻辑上遇到了问题 数据如下: Policy_no, role 1 , 'Owner' 1 , 'Beneficiary' 1 , 'Beneficiary' 2 , 'Owner' 2 , 'Life assured' 3 , 'Life assured' 因此,我尝试按保单号拆分数据,这样,如果有所有者,则标志设置为“1”,但是如果没有所有者,则如果有人寿保险,则标志设置为“1”,但对于所有者和人寿保险,标志不

我试图用策略no分割出一组数据,并根据一组条件设置一个标志,但我在逻辑上遇到了问题

数据如下:

Policy_no, role  
1 , 'Owner'  
1 , 'Beneficiary'  
1 , 'Beneficiary'
2 , 'Owner'
2 , 'Life assured'
3 , 'Life assured'  
因此,我尝试按保单号拆分数据,这样,如果有所有者,则标志设置为“1”,但是如果没有所有者,则如果有人寿保险,则标志设置为“1”,但对于所有者和人寿保险,标志不能都为“y”

即:

我将标题设置为“按唯一键分区”,因为这是我一直尝试的,但目前没有效果。然而,我对新想法持开放态度

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


感谢您使用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
  )
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
  )

使用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演示版

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


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

  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
选择策略\u否
角色
,IIF(个案)
当角色='所有者'时,则为1
当角色=‘人寿保险’时,则为1
其他0
结束=1
及总和(个案)
当角色='所有者'时,则为1
当角色=‘人寿保险’时,则为1
其他0
(完)
结束(
按策略分区(编号)<2,1,IIF(角色='owner',1,0))标志
来自cte
按保单编号订购

SQL Server演示:

由于某些原因,这在我的toad版本中不起作用。它不喜欢关键字Row,你不能为你的第一个查询指定dbms吗?编辑了我的初始帖子,对混淆表示歉意。检查第一个答案它会起作用@EkulSregorThis确实起作用,但它不会将案例之外的设置为0。例如,如果受益人是保单的第一行,则会将其设置为所有者,这是不正确的。至少告诉我们这是用于哪个dbms的。