Ага, другое дело, когда не было русификации и стрелочек… Это то, заставляло меня учить английский. Поражать учителей английского отменными знаниями всех частей тела, видов одежды и т.д.
Похожие мысли возникали, когда мельком видел фильм «Тихоокеанский рубеж». Мне казалось глупым для битвы в воде использовать человекоподобных роботов… (типа для повтора движений человека, но это глуповато даже для фильма, как мне кажется)
С таким же успехом можно было бы, субмарине приделать 10 вращающихся рук с мечом и пускать в бой..
К чему это мне вспомнилось?
Так вот и тут, зачем 2 ноги и 2 руки? Это скорее ограничение, нежели преимущество..
Ага, раздражает, что мы становимся заложниками уникальности. На популярных сервисах почти всегда всё занято. Приходится регаться как Vasya_24634 имя при этом еще и почту в стиле Vasya15_15@....ru :)
Вспомнил историю с плеером Apple. Из-за жалоб пользователей на такую «случайность», Apple пришлось исправить алгоритм. «Мы сделали его менее случайным, чтобы он казался более случайным» — сказал Стив Джобс.
DROP TABLE IF EXISTS My_Values;
CREATE TABLE My_Values (id,sm) --Создаем таблицу с данными
as (
VALUES (1, 45),
(2, 80),
(3 ,75),
(4, 125),
(5, 50),
(6, 70),
(7, 22),
(8, 23),
(9, 47),
(10, 20)
);
DROP TABLE IF EXISTS need_val;
CREATE TABLE need_val(nv)
AS SELECT 125; --- УКАЗЫВАЕМ НАШЕ ЧИСЛО
--p.s. Большие числа с мелкими составными будут очень долго вычисляться
WITH RECURSIVE t AS (
WITH q as (
SELECT DISTINCT
id
, sm
FROM My_Values
WHERE sm <= (SELECT nv FROM need_val) and sm >0
)
SELECT id,
sm,
sm tsm,
id::text AS path,
sm::text AS vals
FROM q
UNION ALL
SELECT
q.id AS id,
q.sm AS sm,
t.tsm + q.sm AS tsm,
(t.path || ','::text) || q.id AS path,
(t.vals || '+'::text) || q.sm AS vals
FROM t
JOIN q ON q.id < t.id
--where (t.tsm + q.sm) <= (SELECT nv FROM need_val)
)
SELECT t.path, tsm,'='||t.vals
FROM t
WHERE t.tsm = (SELECT nv FROM need_val)
--LIMIT 10000;
Прикольное решение, с разрешения автора zoroda выкладываю немного доработанный вариант.
Конечно, рекурсивный перебор не эффективный, но результат не так плох как я думал.
Например: нашел все варианты как можно получить число 195 из суммы чисел кратных трем.
SQL побаловаться
DROP TABLE IF EXISTS My_Values;
CREATE TABLE My_Values (id,sm) --Создаем таблицу с данными
AS (SELECT row_number() over(),* FROM generate_series(0,500,3) ORDER BY 2 DESC );
DROP TABLE IF EXISTS need_val;
CREATE TABLE need_val(nv)
AS SELECT 195; --- УКАЗЫВАЕМ НАШЕ ЧИСЛО
--p.s. Большие числа с мелкими составными будут очень долго вычисляться
WITH RECURSIVE t AS (
WITH q as (
SELECT DISTINCT
id
, sm
FROM My_Values
WHERE sm <= (SELECT nv FROM need_val) and sm >0
)
SELECT id,
sm,
sm tsm,
id::text AS path,
sm::text AS vals
FROM q
UNION ALL
SELECT
q.id AS id,
q.sm AS sm,
t.tsm + q.sm AS tsm,
(t.path || ','::text) || q.id AS path,
(t.vals || '+'::text) || q.sm AS vals
FROM t
JOIN q ON q.id < t.id
where (t.tsm + q.sm) <= (SELECT nv FROM need_val)
)
SELECT t.path, tsm,'='||t.vals
FROM t
WHERE t.tsm = (SELECT nv FROM need_val)
--LIMIT 10000;
Да, здорово!
Выходит, что в данном примере не обязательно выводить порядок для string_agg? Чтобы ничего не сдвинулось без принудительной сортировки.
Похожие мысли возникали, когда мельком видел фильм «Тихоокеанский рубеж». Мне казалось глупым для битвы в воде использовать человекоподобных роботов… (типа для повтора движений человека, но это глуповато даже для фильма, как мне кажется)
С таким же успехом можно было бы, субмарине приделать 10 вращающихся рук с мечом и пускать в бой..
К чему это мне вспомнилось?
Так вот и тут, зачем 2 ноги и 2 руки? Это скорее ограничение, нежели преимущество..
Киберпанк, который мы заслужили..
Надеюсь на них стоит не пиратская винда, а то будет куда все печальнее..
p.s. жду DEV-2
Насчет оператора IN. Давно заметил, что его лучше не использовать, если IN (OVER 9000 rows..)
и обычно переписывал на EXISTS или JOIN
Спасибо за: "=ANY((SELECT array_agg(id) FROM table2)::integer[])" — интересная особенность.
Конечно, рекурсивный перебор не эффективный, но результат не так плох как я думал.
Например: нашел все варианты как можно получить число 195 из суммы чисел кратных трем.
И для тривиальных задач хватает, не все же тут разработчики.