【问题标题】:PLSQL/Oracle How To "Map"/"Normalize" NumberPLSQL/Oracle 如何“映射”/“规范化”数字
【发布时间】: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 内置函数的解决方案。

【问题讨论】:

    标签: c# oracle plsql


    【解决方案1】:

    可以使用Oracle SQL 中的rankdense_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
    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多