为多行分配一个值
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类似的方式,但是有点啰嗦
我有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类似的方式,但是有点啰嗦