我有通常的方式存储数据。
Id | Name | Number
----+------+-------
1 A 101
2 B 102
3 A 103
4 A 105
5 C 104
6 B 106
7 C 108
等等。
现在我想将此表转换为类似于列存储的内容。 例如,应按名称对所有设施进行排序和分组。 此外,如果新记录以相同的名称到达,则应分配一个ID,该ID在为该名称组分配的范围内。
只是详细说明。如果'A'的ID范围为1到20,并且当前在表中有5个ID,那么当新记录到达名称A时,应该为其分配ID = 6.
名称与其他名称一致。每次填充ID时,metatable中的NextID必须递增1。
截至目前,我已经创建了一个元表,用于存储最小,最大ID以及每个名称组的下一个ID。
元表
Name MinID MaxId NextID
---------------------------
A 1 30 6
B 31 60 45
C 61 100 78
使用case语句填充邮件表中的数据。但它的效率非常低,查询也很长。
注意:“数字”列无关紧要。
有什么可能是一种更有效,更快捷的方法来实现这一目标?
答案 0 :(得分:0)
SELECT Name,
MIN( ID ),
MAX( ID ),
COUNT(*) OVER ( PARTITION BY Name ) + 1 AS NextID
FROM YourTable
GROUP BY Name;