PLSQL/Oracle 如何“映射”/“规范化”数字
Posted
技术标签:
【中文标题】PLSQL/Oracle 如何“映射”/“规范化”数字【英文标题】:PLSQL/Oracle How To "Map"/"Normalize" Number 【发布时间】:2016-03-22 05:21:28 【问题描述】:我有一个View
,它从它的一个基表中获取一个名为PRIORITYPOINT
的数字:
CREATE OR REPLACE VIEW VW_INFO
(... --all column names here)
BEQUEATH DEFINER
AS
SELECT
... -- other selected columns
MT.PRIORITYPOINT, -- the column in question
... --other selected columns
FROM MTINFO MT, UTINFO UT
WHERE MT.UTID = UT.UTID
AND MT.EXECREADY = 'R'
AND MT.ISEXEC > 0
现在,我想将查询到的 PRIORITYPOINT
更改为 - 因为缺少/不知道更好的术语 - “规范化”/“映射”形式。
为了说明,我的PRIORITYPOINT
可能如下所示:
76
53
99
1
0
99
345
当它们被“规范化”/“映射”时,它们应该变成这样:
3
2
4
1
0
4
5
上面的“规范化”/“映射”发生的情况是,优先级的宽值范围 (0-345) 被转换为简单的优先级 (0-5)。
此时,我在使用表格的代码中进行“规范化”(我在 C# 中编码):
public List<InfoTable> AssignT5MOInfoViewNormalizedPriorities(List<InfoTable> list, out string eStr)
eStr = "";
try
... //something else
List<double> distinctPriorities = list.Select(x => x.PriorityPoint).Distinct().ToList(); //secondly, normalize points
distinctPriorities.Sort(); //This Sort belongs to List
Dictionary<double, int> distinctPrioritiesDict =
distinctPriorities.Zip(Enumerable.Range(0, distinctPriorities.Count), (k, v) => new k, v )
.ToDictionary(x => x.k, x => x.v);
for (int i = 0; i < list.Count; ++i)
list[i].PriorityPoint = distinctPrioritiesDict[list[i].PriorityPoint];
return list;
catch (Exception e) //for whatever reason, doesn't matter for now...
eStr = e.ToString();
//something else
return null;
有没有办法在PLSQL
中进行“规范化”/“映射”?
编辑:
我正在使用Oracle
数据库。我也可以使用 Oracle
内置函数的解决方案。
【问题讨论】:
【参考方案1】:可以使用Oracle SQL 中的rank
和dense_rank
函数来获取标准化值。
例如
SELECT
MT.PRIORITYPOINT
, RANK() OVER (ORDER BY MT.PRIORITYPOINT ASC) AS EXAMPLE1
, DENSE_RANK() OVER (ORDER BY MT.PRIORITYPOINT ASC) - 1 AS EXAMPLE2
... --other selected columns
FROM MTINFO MT, UTINFO UT
WHERE MT.UTID = UT.UTID
AND MT.EXECREADY = 'R'
AND MT.ISEXEC > 0
【讨论】:
感谢您的帮助。它几乎在那里,但还没有...... :( 因为您显示的Rank
不会处理重复项。在上面的示例中,我得到的结果如下:0 1 2 3 4 4 6
- 请注意5
不见了。还有其他建议吗?(尽管如此,我赞成这种亲密关系)
你可以使用 DENSE_RANK 代替
@Ian DENSE_RANK() OVER (ORDER BY MT.PRIORITYPOINT ASC) - 1
以上是关于PLSQL/Oracle 如何“映射”/“规范化”数字的主要内容,如果未能解决你的问题,请参考以下文章
如何在 plsql (Oracle) 中创建 zip 文件夹
如何在 plsql (Oracle) 中创建 zip 文件夹
如何从 PLSQL Oracle 过程中删除数据或清空游标?