我使用的是Oracle SQL,我需要有关硬查询的帮助。
我有下表(MyTable
):
id int,
name1 int,
name2 int,
..
..
..
name80 int,
这些列名是假的。
这是我的问题:
select id ,cnt / (select count(*) from MyTable)
from(
select id, name1, name2, count(distinct name1) over(partition by name2) cnt
from my MyTable);
我需要每次为下一对列运行此查询。例如,下一对将是:
select id ,cnt / (select count(*) from MyTable)
from(
select id, name2, name3, count(distinct name2) over(partition by name3) cnt
from my MyTable);
等等。
最终输出表需要包含id和每对计算。
id int,
"calc of name1+name2" float,
"calc of name2+name3" float,
"calc of name3+name4" float,
"calc of name4+name5" float,
"calc of name5+name6" float,
...
...
...
"calc of name79+name80" float,
有人可以告诉我该怎么做吗?我真的很感激任何帮助。我感到迷茫。
答案 0 :(得分:3)
我错过了什么吗?你想要一个像这样的查询:
select id,
count(distinct name2) over (partition by name3) / count(*) over (),
count(distinct name3) over (partition by name4) / count(*) over (),
. . .
from mytable;
我的猜测是你的问题是输入所有这些行。
您可以运行这样的查询来生成代码:
select replace(replace('count(distinct <thiscol>) over (partition by <nextcol>) / count(*) over () as <thiscol>_<nextcol>,',
'<thiscol>', column_name
), '<nextcol>', lead(column_name) over (order by column_id)
)
from all_tab_columns atc
where table_name = 'mytable'
答案 1 :(得分:0)
您可以对表列元数据使用动态sql(EXECUTE IMMEDIATE)和USER_TAB_COLUMNS表。