创建一个接受结果集作为参数的mysql函数?

时间:2017-04-11 04:02:04

标签: mysql

是否可以创建一个mySQL函数,该函数接受查询中的结果集作为参数?

基本上我有很多查询将返回结果结果集,如下所示:

  id   |  score
  70   |   25
  71   |    7
  72   |  215
  74   |   32
  75   |  710
  76   |   34
  78   |  998
  79   |  103
  80   |    3

我希望将值标准化,使它们达到0到1之间的范围。 我认为我这样做的方式是应用计算:

nscore = (score-min(score))/(max(score) - min(score))

获得以下结果

  id   |  score
  70   |  0.022
  71   |  0.004
  72   |  0.213
  74   |  0.029
  75   |  0.710
  76   |  0.031
  78   |  1.000
  79   |  0.100
  80   |  0.000

但我无法提出查询来获取此查询中的最小值和最大值以及结果,因此考虑使用函数(不能使用存储过程)但无法记录如何传递结果集。

任何帮助表示赞赏!
谢谢!

编辑: 结果中的得分字段是计算字段。无法直接选择它。

例如:返回上述结果的示例查询 - select t.id as id, count(*) as score from tbl t inner join tbl2 t2 on t.idx = t2.idx where t2.role in (.....) 仅用于演示目的,而非实际架构或查询

1 个答案:

答案 0 :(得分:1)

没有。 MySQL不支持使用结果集作为参数定义函数。

不幸的是,MySQL不支持公用表表达式(CTE),也不支持分析函数。

要从MySQL查询中获取此结果...在MySQL中执行此操作的一种方法是将原始查询作为内联视图返回,两次次...

举个例子:

SELECT t.id
     , (t.score-s.min_score)/(s.max_score-s.min_score) AS normalized_score
  FROM ( 
         -- original query here
         SELECT id, score FROM ...
       ) t
 CROSS
  JOIN ( SELECT MIN(r.score) AS min_score
              , MAX(r.score) AS max_score
           FROM (
                  -- original query here
                  SELECT id, score FROM ...   
                ) r
       ) s
 ORDER BY t.id 

修改

根据添加到问题的查询......

SELECT q.id
     , (q.score-s.min_score)/(s.max_score-s.min_score) AS normalized_score
  FROM ( -- original query goes here
         -- ------------------------ 

                  select t.id as id, count(*) as score 
                  from tbl t 
                  inner join tbl2 t2 on t.idx = t2.idx
                  where t2.role in (.....)

         -- ------------------------ 
       ) q
 CROSS
  JOIN ( SELECT MIN(r.score) AS min_score
              , MAX(r.score) AS max_score
           FROM ( -- original query goes here
                  -- ------------------------ 

                  select t.id as id, count(*) as score 
                  from tbl t 
                  inner join tbl2 t2 on t.idx = t2.idx
                  where t2.role in (.....)

                  -- ------------------------ 
                ) r
       ) s
 ORDER BY q.id