一遍又一遍地运行相同的查询

时间:2014-12-03 11:15:32

标签: sql oracle loops

我使用的是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,

有人可以告诉我该怎么做吗?我真的很感激任何帮助。我感到迷茫。

2 个答案:

答案 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表。