【问题标题】:Select top N columns based on standardized values根据标准化值选择前 N 列
【发布时间】:2017-11-21 23:24:10
【问题描述】:

有一点谷歌问题。如果所有值都是标准化的,是否可以根据每列中的值选择 10 列。

例如

cluster Id | v1 | v2| v3 | v4 | v6 | v26 
___________________________________________
       1   | 4.2|0.9|05  |3.2 | 0.7|0.5
       2   | 1.2|0.1|0.9 |0.21|0.3 |0.1

所以在这个例子中,如果我想要集群 1 的 3 个前三列,我会拥有

     cluster ID |v1 |v4 |v2
            1   |4.2|3.2|0.9

目前我正在使用 Oracle Sql,但我愿意接受任何建议,但如果在不同平台上有解决方案并且使用 SQL 是不可能的,我愿意切换

编辑。我添加了一张图片,显示了我试图在 Sql 开发人员上复制的功能。提取大小是变量/属性的数量,当我更改提取大小时,模型后面必须有一些表格正在被查询,这就是我试图重现的语句 谢谢

【问题讨论】:

  • 前 3 名?您的意思是第 3 列或前 3 行(假设是前者)?另外,您要确切解决什么问题?你可能想错了(比如使用参数/实体)
  • "所有的值都是标准化的"?这意味着什么?然后:输出的期望格式是什么?四列的结果集?您是否需要“记住”最高值来自列 v1、v4、v2? (您也有一个错字:值 4.2 来自 v1,而不是 v2)。无论语言/平台如何,整个项目都非常模糊。
  • Austin French - 排名前三的列,其想法是用最高均值提取变量。我使用 ODM 和 K 表示聚类来创建模型,我可以使用 Sql 上的模型查看器查看我想要的数据并更改设置以获取每个集群的前 10、20 个等变量。但是我不能将查询重新创建为一个选择语句,它的所有菜单驱动。
  • @mathguy 。 . . “标准化”是一个统计术语,您减去平均值并除以标准偏差。它从列中删除单位并将所有列置于兼容范围内。它对于一系列统计技术非常有用。
  • 1) 是否总是有6 值列? 2) 你会一直选择相同数量的最高值吗? 3)你不能重命名列,所以你更喜欢cluster_id, 1st_col_num, 1st_col_val, 2nd_col_num, 2nd_col_val, etc, etc (最大值总是在1st_这对列中,col_num告诉你col_val来自哪一列),或者您更愿意保留cluster_id, v1, v2, v3, v4, v5, etc 并只将NULL 放在不在最高值集中的列中?

标签: sql database oracle plsql


【解决方案1】:

如果您想要前三个值,我会取消透视数据并重新聚合。 Oracle 12c 为此提供了一些有用的功能;对于早期版本,我只会使用更传统的 SQL 方法。

不清楚您想要列名还是值。以下两者兼而有之:

select id,
       max(case when seqnum = 1 then v end) as v_1,
       max(case when seqnum = 2 then v end) as v_2,
       max(case when seqnum = 3 then v end) as v_3,
       max(case when seqnum = 1 then which end) as which_1,
       max(case when seqnum = 2 then which end) as which_2,
       max(case when seqnum = 3 then which end) as which_3
from (select id, v, which, row_number() over (partition by id order by v desc) as seqnum
      from ((select id, v1 as v, 'v1' as which from t) union all
            (select id, v2 as v, 'v2' as which from t) union all
            (select id, v3 as v, 'v3' as which from t) union all
            (select id, v4 as v, 'v4' as which from t) union all
            (select id, v5 as v, 'v5' as which from t)
           ) t
      ) t
group by id;

【讨论】:

  • 我还建议 OP 保留子查询的结果而不重新旋转它们的可能性。只是一种带有cluster_id, rank, column_identifier, value的EAV表。
【解决方案2】:

最后,我采用的方法是检查在我的数据集集群期间创建的所有 Oracle Data Miner 表。其中一个表 DM$PTCLUS_K_M_1_2 包含一个包含所有集群、值、变量 ID 和名称的数据透视表。使用我的示例在此处重新创建

cluster_id,variable_id,value,variable_name
   1      |  1        | 4.2 | v1

通过使用 where 子句 (cluster_id) 执行嵌套选择语句并按值排序,我可以为每个集群挑选出前 10 个变量及其值

select * from 
 (select * from DM$PTCLUS_K_M_1_2
     where cluster_id = 1
     order by value)
  where rownum < 11

对于那些有类似问题并希望获得集群质心或值的人,我建议查看数据挖掘器架构并检查那里的表,其中一些将包含您需要的数据

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 2014-05-22
    • 2021-10-25
    • 2019-11-25
    • 2017-12-13
    • 1970-01-01
    • 2021-07-11
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多