sql求最大数占比问题

zhangp_04 发布于 2013/04/16 08:35
阅读 564
收藏 0
DB2

我有一个表 表如下:


create table MM_DATAVALUE
(
    DataCode            VARCHAR(25)            not null,
    Col                 INTEGER                not null,
    Row                 INTEGER                not null,
    DataVal             VARCHAR(60),
   constraint  P_Key_1  primary key ( DataCode ,  Col ,  Row )
)
in TBS1
 index in TBS_IDX;



datacode             row               col                dataval

---------------------------------------------------------------------

aaaaaaaa            1                    1                     1

aaaaaaaa             1                   2                     2

aaaaaaaa            1                    3                     2

aaaaaaaa            2                   1                    4

aaaaaaaa            2                   2                     4

aaaaaaaa            2                    3                     2

aaaaaaaa            3                  1                    5

aaaaaaaa            2                   2                     5

aaaaaaaa            3                    3                     5




我想根据datacode 得到 datacode下 每一列的 出现次数最多的数字 并求出这个数字在这一列中的占比.

我想到了一种sql是通过求出第一列出现次数最多的一列和占比 然后union上第二列的和union上第三列的

SELECT 1 index, dataval,NUM,round(ratio,2) FROM ( Select dataval,Count(1) AS num,(Count(1)+0.0)/(Select Count(1) from MM_DATAVALUE WHERE datacode='aaaaa' AND col=1)*100 As ratio from MM_DATAVALUE WHERE DATACODE='aaaaa' AND col=1 GROUP BY COL,dataval ORDER BY num DESC FETCH FIRST ROW ONLY ) UNION all  第二列  union all第三列



问:

有没有更简便的sql 因为 这个表的列是动态的 有可能会有200列 如果union all 200列 效率可能不高






加载中
0
泡不烂的凉粉
泡不烂的凉粉
说真的, 没看懂。
0
魔力猫
魔力猫
你先把数据结构转为标准的关系表再想办法。
0
z
zhangp_04

引用来自“魔力猫”的答案

你先把数据结构转为标准的关系表再想办法。
你的意思是先行转列 然后再求每一列里 出现次数最多的数的占比?
魔力猫
魔力猫
没错。不要在动态表本身上面折腾,先转为标准的数据库表,再进行处理。
0
wx---每日佳选
wx---每日佳选

如果是我做,我会表另表一张表来存储你想要的结果。

我不想搞一个异常得复杂的SQL,还不容易看懂。

0
SueYY
SueYY
你得了解, 不是所有的SQL都一次性解决问题,很有可能会付出不小的代价。。 需要的时候尽可能分解步骤,加上程序,再产出。
0
z
zhangp_04

引用来自“非良”的答案

如果是我做,我会表另表一张表来存储你想要的结果。

我不想搞一个异常得复杂的SQL,还不容易看懂。

这个表会有千万条数据,都是以行,列,值,id的形式存储的,

所以如果我有一个id 有5000行 100列  这个id的数据量在这个表中就是5000*100的数据量

如果用程序 效率肯定很低  我也不想用sql union出每一列的占比(sql在上面),有没有更简单的写法?

wx---每日佳选
wx---每日佳选
从你的需求入手,再考虑考虑吧。如此费劲的算法,到底值不值的做。
0
z
zhangp_04

引用来自“SueYY”的答案

你得了解, 不是所有的SQL都一次性解决问题,很有可能会付出不小的代价。。 需要的时候尽可能分解步骤,加上程序,再产出。

这个表会有千万条数据,都是以行,列,值,id的形式存储的,

所以如果我有一个id 有5000行 100列  这个id的数据量在这个表中就是5000*100的数据量

如果用程序 效率肯定很低  我也不想用sql union出每一列的占比(sql在上面),有没有更简单的写法?

SueYY
SueYY
可不可以加一张冗余表,这个表直接记录次数,剩下的你就可以自己算了。 但是这得要求俩张表的维护起来要严谨。
0
z
zhangp_04

这个表的数据是通过导入 生成的 ,比如 我在excel里有 1000行 50列的数据 导入表中就是1000*50的数据量

我再导一个500行200列的数据 那么就是datacode下的数据量就是 500*200的数据量

0
z
zhangp_04
想要的实现是 求出  唯一datacode(主键)下 每一列 出现次数最多的数字 ,如果有多个数字次数一样,只取第一个数字就可以了.并求出这个数字在这一列中的占比 .
返回顶部
顶部