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

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

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

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

10-11 03:22