sql - 根据列值生成 ID

标签 sql tsql

我有以下代表项目和事件之间映射的数据集:

ProjectID  ActivityID
A         A
B         B
B         C
D         D
E         D
M         N

我想根据以下规则计算一个 ID:

a project that maps 1-1 with an activity:
A - A
M - N

one project that maps to multiple activities:
B - B
B - C

one activity that maps to multiple projects:
D - D
E - D

这会产生:

ProjectID  Activity CalculatedID
A         A        1
B         B        2
B         C        2
D         D        3
E         D        3
M         N        4

我希望那里有足够的信息,任何想法都会受到赞赏。我对寻找基于集合的方法特别感兴趣。

-- 更新:关于答案的注释-- 我将@Erwin 采用的方法描述为映射的分类,这与@mellamokb(基于@CodeByMoonlight 的解决方案)提供的分配顺序 ID 的解决方案形成对比。你们的两个解决方案都对我有帮助,谢谢大家!

最佳答案

虽然有点复杂,但确实有效:

SELECT ProjectID, ActivityID,
DENSE_RANK() OVER(ORDER BY ProjectID) +
DENSE_RANK() OVER(ORDER BY ActivityID) -
ROW_NUMBER() OVER(ORDER BY ProjectID, ActivityID) AS CalculatedID
FROM MyTable

当 ProjectID 或 ActivityID 重复出现时,DENSE_RANK 的两种用途会产生针对 ROW_NUMBER 的偏移量。

关于sql - 根据列值生成 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9890631/

相关文章:

sql - 检查两列的外键

sql - Json_value 和 Json_query 找不到指定的路径

SQL 语句 ON v WHERE

mysql更新一个字段加1

SQL Server 不同的

SQL 查询设计未返回预期结果

sql - T-SQL 更新架构中的 XPath

sql - if else 带参数的 postgres 过程

php - 如何从数据库制作动态菜单模块

sql-server - 我的 PIVOT 返回重复行,每行中包含数据透视列值