Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Интересные задачи по SQL [2]
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Champion
Верно, идея использовать нумерацию сразу в ON вместо HAVING - существенное улучшение того, что написал я. Во всем этом мне был интересен вопрос - существует ли возможность при произвольных множествах строк одинаковой мощности соединять их "в порядке следования", то есть
case when itsfirst = 1 then t1.FIELD else t2.FIELD end,
case when itsfirst = 0 then t1.FIELD else t2.FIELD end
FROM(
SELECT 1 itsfirst, t1.FIELDFROM t1
UNIONALL
SELECT 0, t2.FIELDFROM t2
) t
CROSSJOIN(SELECT 1 n UNIONALLSELECT 0 n)x
ORDERBY itsfirst, orderfield
Думаю, что благодаря сортировке они склеятся как надо.
Всего по одному чтению обеих таблиц.
UPD
Сторомозил, так конечно шахматы получатся. Надо сгруппировать по счетчику, а его нету
EuGen
Отправлено: 27 Мая, 2013 - 17:51:58
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Наткнулся. Дана таблица `test`, в ней есть поле `mult`, которое является полем вещественного типа (FLOAT для MySQL, к примеру). Для простоты считаем, что поле объявлено как NOT NULL. Задача - посчитать произведение значений поля `mult` во всей таблице одним запросом.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Contr
Отправлено: 19 Июня, 2013 - 09:31:33
Частый гость
Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011 Откуда: с Марса
Помог: 1 раз(а)
EuGen пишет:
Наткнулся. Дана таблица `test`, в ней есть поле `mult`, которое является полем вещественного типа (FLOAT для MySQL, к примеру). Для простоты считаем, что поле объявлено как NOT NULL. Задача - посчитать произведение значений поля `mult` во всей таблице одним запросом.
Мое решение:
WITH RECURSIVE t(a) AS (
SELECT mult FROM test LIMIT 1),
r(a) AS (SELECT a FROM t
UNION ALL
SELECT mult*a FROM test, r)
SELECT a FROM r
Надо заметить - СУБД постгре
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
DeepVarvar пишет:
Сложность таки в том что это мускуль.
На самом деле, в условии задачи я этого не указал, однако, действительно, интерес в том, чтобы обойтись стандартным SQL, плюс, вероятно, некоторым набором стандартных функций. Тем не менее решение выше вполне удовлетворяет общему условию задачи (без привязки к СУБД)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Champion
Отправлено: 19 Июня, 2013 - 18:04:55
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Универсальное решение, видимо, только одно - то, которое привел EuGen. В принципе, это первый курс колледжа, приходит в голову довольно быстро. (Добавление) Contr, можно пез первого cte с лимитом. Его можно использовать и в анкорной части рекурсивного cte. (Добавление)
Ну а вот еще решение:
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Используется СУБД MySQL. Дана таблица test. У неё есть два поля id и title - требуется добавить новую колонку, например, new - значение в которой будет увеличиваться каждые 100 строк по символам английского алфафита. То есть 1-100 строка значение 'A', 101-200 строка значение 'B' и т.п. После значения 'Z' процесс циклически повторяется (то есть начинается снова с 'A').
Требуется сделать это одним запросом (предполагается, что соответствующий ALTER-DDL для добавления колонки new уже сделан).
Работоспособность не проверил, не было возможности.
EuGen
Отправлено: 20 Ноября, 2013 - 09:01:21
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Дано: СУБД MySQL. Таблица, в которой может быть переменное число столбцов с разными именами и последний столбец всегда имеет имя constant. Все столбцы имеют целочисленный тип, а в столбце constant всегда записывается значение, большее нуля. Например, 4 стобца + столбец constant:
Известно также, что строк в таблице будет не более 100. Колонок в общем случае может быть так же до 100, их имена произвольны. Требуется: написать запрос, который для каждой строки вернёт сумму её первых constant колонок. То есть, к примеру, для таблицы выше, для первой строки это foo+bar; а для, например, 4-й строки это foo+bar+baz. Таким образом, результат для таблицы выше должен быть таким:
У таблицы нет первичного ключа или иной колонки (набора колонок), которые бы можно было им сделать. Разрешается использовать специфичные средства СУБД, но не допускается использование хранимого кода (процедур).
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.