Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
with
-- закомментировал тестовый генератор
--a(n) as (select/*+ cardinality(1000) */ level-1 n from dual connect by level<=1000),
----------------------
-- calc: пошли вычисления
-- аггрегируем уникальные числа, чтобы уменьшить объемы для перебора
x0 as (select n,count(*) cnt from a group by n order by n)
-- за один "урезанный" селф-джойн рассчитываем и суммируем сразу и суммы и произведения:
,x1 as (
select
x.n + y.n as s
,x.n * y.n as m
,2*sum(x.cnt*y.cnt) cnt
from x0 x,x0 y
where y.n>=x.n -- возьмем только один вариант и просто умножим на 2
group by
x.n + y.n
,x.n * y.n
)
-- тут уже объем для перебора становится практически минимальным:
select sum(x1.cnt*x2.cnt) total
from x1,x1 x2
where x1.s=x2.m;create table a(n) as select ceil(dbms_random.value(0,500)) n from dual connect by level<=1e4ж решается за 0.5сек. Если же начать собирать сами комбинации чисел, то объемы и время расчета существенно вырастут. По идее, есть еще эвристики для уменьшения перебора да и оптимизации, например, автоматическое деление на группы диапазонов, но их делать уже будет сложнее и в условиях спешки я бы не стал их заморачиватьсяselect sum(x*x)
from (select count(*) x
from vpoupkine.abacus t1
, vpoupkine.abacus t2
group by t1.n + t2.n)create table a(n) as
select ceil(dbms_random.value(0,500)) n from dual connect by level<=1e4;with a(n) as (select level-1 from dual connect by level<=10)
select sum(x*x)
from (select count(*) x
from a t1
, a t2
group by t1.n + t2.n)create table abacus as
(select level as n from dual connect by level < 10);
select count(1)
from abacus a, abacus b, abacus c, abacus d
where a.n+b.n = c.n+d.n;
>>> 489
select sum(x*x)
from (select count(*) x
from abacus t1
, abacus t2
group by t1.n + t2.n);
>>> 489
create table abacus_pairs as (
select t1.n + t2.n s
, t1.n * t2.n m
from abacus t1
, abacus t2;
select count(*)
from abacus_pairs a
, abacus_pairs b
where a.s = b.m;
Как мы делали олимпиаду по SQL (окончание)