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
Форумы портала PHP.SU :: Версия для печати :: Интересные задачи по SQL [2]
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Интересные задачи по SQL

Страниц (2): « 1 [2]
 

16. EuGen - 09 Июня, 2012 - 13:58:00 - перейти к сообщению
Champion
Верно, идея использовать нумерацию сразу в ON вместо HAVING - существенное улучшение того, что написал я. Во всем этом мне был интересен вопрос - существует ли возможность при произвольных множествах строк одинаковой мощности соединять их "в порядке следования", то есть
CODE (htmlphp):
скопировать код в буфер обмена
  1. A0 ---> B0
  2. A1 ---> B1
  3. A2 ---> B2
  4.    ...
  5. An ---> Bn
17. DeepVarvar - 09 Июня, 2012 - 14:28:09 - перейти к сообщению
Прогнал...
18. Champion - 12 Июня, 2012 - 16:18:26 - перейти к сообщению
EuGen пишет:
существует ли возможность при произвольных множествах строк одинаковой мощности соединять их "в порядке следования"
Есть еще один вариант без использования переменных:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2. case when itsfirst = 1 then t1.FIELD else t2.FIELD end,
  3. case when itsfirst = 0 then t1.FIELD else t2.FIELD end
  4. FROM (
  5. SELECT 1 itsfirst, t1.FIELD FROM t1
  6. UNION ALL
  7. SELECT 0, t2.FIELD FROM t2
  8. ) t
  9. CROSS JOIN (SELECT 1 n UNION ALL SELECT 0 n)x
  10. ORDER BY itsfirst, orderfield
Думаю, что благодаря сортировке они склеятся как надо.
Всего по одному чтению обеих таблиц.

UPD
Сторомозил, так конечно шахматы получатся. Надо сгруппировать по счетчику, а его нету
19. EuGen - 27 Мая, 2013 - 17:51:58 - перейти к сообщению
Наткнулся. Дана таблица `test`, в ней есть поле `mult`, которое является полем вещественного типа (FLOAT для MySQL, к примеру). Для простоты считаем, что поле объявлено как NOT NULL. Задача - посчитать произведение значений поля `mult` во всей таблице одним запросом.
моё решение для MySQL (Отобразить)
20. Contr - 19 Июня, 2013 - 09:31:33 - перейти к сообщению
EuGen пишет:
Наткнулся. Дана таблица `test`, в ней есть поле `mult`, которое является полем вещественного типа (FLOAT для MySQL, к примеру). Для простоты считаем, что поле объявлено как NOT NULL. Задача - посчитать произведение значений поля `mult` во всей таблице одним запросом.
моё решение для MySQL (Отобразить)

Мое решение:
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
Надо заметить - СУБД постгре
21. DeepVarvar - 19 Июня, 2013 - 16:39:14 - перейти к сообщению
Contr пишет:
WITH RECURSIVE
Мускуль так не умеет. Сложность таки в том что это мускуль.
22. EuGen - 19 Июня, 2013 - 16:41:18 - перейти к сообщению
DeepVarvar пишет:
Сложность таки в том что это мускуль.

На самом деле, в условии задачи я этого не указал, однако, действительно, интерес в том, чтобы обойтись стандартным SQL, плюс, вероятно, некоторым набором стандартных функций. Тем не менее решение выше вполне удовлетворяет общему условию задачи (без привязки к СУБД)
23. Champion - 19 Июня, 2013 - 18:04:55 - перейти к сообщению
Универсальное решение, видимо, только одно - то, которое привел EuGen. В принципе, это первый курс колледжа, приходит в голову довольно быстро.
(Добавление)
Contr, можно пез первого cte с лимитом. Его можно использовать и в анкорной части рекурсивного cte.
(Добавление)
Ну а вот еще решение:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT res
  2. FROM(
  3. SELECT
  4. @x := @x * mult res,
  5. @n := $n + 1 rn
  6. FROM test
  7. CROSS jon (SELECT @x := 1.00000 x, @n := 1  t) t
  8. ) t
  9. ORDER BY res DESC LIMIT 1
24. EuGen - 21 Октября, 2013 - 13:19:13 - перейти к сообщению
Используется СУБД MySQL. Дана таблица test. У неё есть два поля id и title - требуется добавить новую колонку, например, new - значение в которой будет увеличиваться каждые 100 строк по символам английского алфафита. То есть 1-100 строка значение 'A', 101-200 строка значение 'B' и т.п. После значения 'Z' процесс циклически повторяется (то есть начинается снова с 'A').
Требуется сделать это одним запросом (предполагается, что соответствующий ALTER-DDL для добавления колонки new уже сделан).

вариант (Отобразить)
25. Champion - 21 Октября, 2013 - 19:26:33 - перейти к сообщению
Примерно вот так можно (почти то же самое, только букву по-другому получил).
Спойлер (Отобразить)
Работоспособность не проверил, не было возможности.
26. EuGen - 20 Ноября, 2013 - 09:01:21 - перейти к сообщению
Дано: СУБД MySQL. Таблица, в которой может быть переменное число столбцов с разными именами и последний столбец всегда имеет имя constant. Все столбцы имеют целочисленный тип, а в столбце constant всегда записывается значение, большее нуля. Например, 4 стобца + столбец constant:
PHP:
скопировать код в буфер обмена
  1. +------+------+------+------+----------+
  2. | foo  | bar  | baz  | feo  | constant |
  3. +------+------+------+------+----------+
  4. |    2 |    5 |    6 |    0 |        2 |
  5. |    1 | -100 |    0 |    0 |        1 |
  6. |    3 |   10 |  -10 |    0 |        3 |
  7. |    4 |    0 |   -1 |    5 |        3 |
  8. |   -1 |    1 |   -1 |    1 |        4 |
  9. +------+------+------+------+----------+

Известно также, что строк в таблице будет не более 100. Колонок в общем случае может быть так же до 100, их имена произвольны. Требуется: написать запрос, который для каждой строки вернёт сумму её первых constant колонок. То есть, к примеру, для таблицы выше, для первой строки это foo+bar; а для, например, 4-й строки это foo+bar+baz. Таким образом, результат для таблицы выше должен быть таким:
PHP:
скопировать код в буфер обмена
  1. +--------+
  2. | result |
  3. +--------+
  4. |      7 |
  5. |      1 |
  6. |      3 |
  7. |      3 |
  8. |      0 |
  9. +--------+

У таблицы нет первичного ключа или иной колонки (набора колонок), которые бы можно было им сделать. Разрешается использовать специфичные средства СУБД, но не допускается использование хранимого кода (процедур).
мой вариант (Отобразить)

 

Powered by ExBB FM 1.0 RC1