我有以下数据集表示项目和事件之间的映射:
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/