为多行分配一个值

Assign one value to multiple rows

我有table这样的东西:

     id              call_id                         user       call_date       current_id     grp_val
    296030  80ee830b-dcb5-40c2-9568-c0d9082376c6    a@4com.im   08:04:00.000    38124085313:0     1
    296031  80ee830b-dcb5-40c2-9568-c0d9082376c6    b@4com.im   08:04:00.000    38124084629:0     2
    296032  80ee830b-dcb5-40c2-9568-c0d9082376c6    a@5com.im   09:51:00.000    38124255283:0     3
    296033  162ba8a3-3940-4258-8c7d-4ef31c092c8e    a@6com.im   09:51:00.000    38124255283:1     4
    296034  162ba8a3-3940-4258-8c7d-4ef31c092c8g    a@4com.im   13:10:33.753    38124255283:2     5
    296035  162ba8a3-3940-4258-8c7d-4ef31c092c8y    a@4com.im   13:30:41.387    38124255283:4     6
    296042  ed42cb64-70d0-44f9-8ac6-2cac4b4c19c5    a@4com.im   16:28:00.000    38124894109:0     1
    296043  ed42cb64-70d0-44f9-8ac6-2cac4b4c19c5    b@4com.im   16:28:00.000    38124892991:0     2
    296044  6370e3ac-fbda-4e0f-b946-71d4f87fccae    a@4com.im   16:41:00.000    38124910303:0     1
    296045  82e7db68-5c99-499a-9f9b-4d799f4df2e4    a@4com.im   16:41:00.000    38124910303:1     2

我想要实现的是将所有相似的调用用一个id 组合在一起。像这样:

id              call_id                             user         call_date   current_id     grp_val  exch_id
    296030  80ee830b-dcb5-40c2-9568-c0d9082376c6    a@4com.im   08:04:00.000 38124085313:0     1      1
    296031  80ee830b-dcb5-40c2-9568-c0d9082376c6    b@4com.im   08:04:00.000 38124084629:0     2      1
    296032  80ee830b-dcb5-40c2-9568-c0d9082376c6    a@5com.im   09:51:00.000 38124255283:0     3      1
    296033  162ba8a3-3940-4258-8c7d-4ef31c092c8e    a@6com.im   09:51:00.000 38124255283:1     4      1
    296034  162ba8a3-3940-4258-8c7d-4ef31c092c8g    a@4com.im   13:10:33.753 38124255283:2     5      1
    296035  162ba8a3-3940-4258-8c7d-4ef31c092c8y    a@4com.im   13:30:41.387 38124255283:4     6      1  
    296042  ed42cb64-70d0-44f9-8ac6-2cac4b4c19c5    a@4com.im   16:28:00.000 38124894109:0     1      2
    296043  ed42cb64-70d0-44f9-8ac6-2cac4b4c19c5    b@4com.im   16:28:00.000 38124892991:0     2      2
    296044  6370e3ac-fbda-4e0f-b946-71d4f87fccae    a@4com.im   16:41:00.000 38124910303:0     1      3
    296045  82e7db68-5c99-499a-9f9b-4d799f4df2e4    a@4com.im   16:41:00.000 38124910303:1     2      3

如何通过上述 table 实现上述结果?

我建议你:

SUM(CASE WHEN grp_val = 1 THEN 1 END) OVER(ORDER BY id)

这有效地将 grp_val 变成一列 1(当 grp_val 为 1 时)或空列(否则),并且当按 ID 排序时,暗示对于每一行 SUM () OVER() 将对包括当前行在内的所有先前行进行操作。它是 SUM(CASE WHEN grp_val = 1 THEN 1 END) OVER(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

的缩写形式

如果您的数据是这样的:

grp_val, CASE WHEN ..., SUM OVER
1        1              1 (1)
2        NULL           1 (1+NULL)
3        NULL           1 (1+NULL+NULL)
1        1              2 (1+NULL+NULL+1)
2        NULL           2 (1+NULL+NULL+1+NULL)

您还可以使用 LAG 查看前一行值,例如 LAG(call_id) OVER(ORDER BY id) 它是前一行调用 ID,因此您可以说 CASE WHEN LAG(call_id) OVER(ORDER BY id) = call_id OR LAG(LEFT(current_id, CHARINDEX(':', current_id))) OVER(ORDER BY id) = LEFT(current_id, CHARINDEX(':', current_id)) THEN 0 ELSE 1 END - 它是“if prev row call_id 与此行相同,或冒号前的上一行 current_id 与冒号前的此行 current_id 相同,然后是 0 else 1" .. 这些 0/1 应该是 SUM OVER'd in类似的方式,但是有点啰嗦