задачка
9 отговора
920 прегледа
задачка
Привет.
Имаме таблица, в която данните могат да се разделят на групи. Например :
AA
AB
AC
BA
BB
CA
CB
CC
Това е таблица с една колона. Критерият за групите е първата буква, т.е. тук имаме 3 групи
1) АА, AB, AC
2) BA, BB
3) CA, CB, CC.
Зачачата е към тази таблица да се добави колона, в която са "индексирани" елементите на групите (номерирани от 1 до N, където N e броят на елементите в групата). За наредба в групите може да се използва произволен критерий - в случая лексикографската наредба.
AA 1
AB 2
AC 3
BA 1
BB 2
CA 1
CB 2
CC 3
Идеята е задачата да се реши без използване на FOR/WHILE цикли - само със стандартни SQL оператори.
Също показаната тук таблица е само примерна, т.е. не може да се използва това че от ASCII(A)-64 ще получим 1, ASCII(B)-64 = 2 и т.н.
Могат да се ползват/създават/join-ват и допълнителни таблици. Например таблица с индекси :
1
2
3
...
Както и добавяне и триене на колоно (CREATE TABLE, ALTER ...)
sunsande
Имаме таблица, в която данните могат да се разделят на групи. Например :
AA
AB
AC
BA
BB
CA
CB
CC
Това е таблица с една колона. Критерият за групите е първата буква, т.е. тук имаме 3 групи
1) АА, AB, AC
2) BA, BB
3) CA, CB, CC.
Зачачата е към тази таблица да се добави колона, в която са "индексирани" елементите на групите (номерирани от 1 до N, където N e броят на елементите в групата). За наредба в групите може да се използва произволен критерий - в случая лексикографската наредба.
AA 1
AB 2
AC 3
BA 1
BB 2
CA 1
CB 2
CC 3
Идеята е задачата да се реши без използване на FOR/WHILE цикли - само със стандартни SQL оператори.
Също показаната тук таблица е само примерна, т.е. не може да се използва това че от ASCII(A)-64 ще получим 1, ASCII(B)-64 = 2 и т.н.
Могат да се ползват/създават/join-ват и допълнителни таблици. Например таблица с индекси :
1
2
3
...
Както и добавяне и триене на колоно (CREATE TABLE, ALTER ...)
sunsande
Re: задачка
SELECT str_fld,
ISNULL(
(SELECT COUNT(*)
FROM TTT AS X
WHERE LEFT(X.str_fld, 1) = LEFT(TTT.str_fld, 1)
AND X.str_fld < TTT.str_fld
)
, 0) + 1 AS Number
FROM TTT
[pre/]
м/у другото
Я дай да ти видим решението, че като ти гледам въпроса искаш да се похвалиш с нещо гениално
.
Чакам
Чакам
Re: м/у другото
Не мога да се похваля с нищо гениално :)
От време навреме научавам или се досещам за някой трик и това е ...
но тази задача не успях да реша.
Браво за решението и благодарско !
sunsande
От време навреме научавам или се досещам за някой трик и това е ...
но тази задача не успях да реша.
Браво за решението и благодарско !
sunsande
задачка за тебе
Щом си любител на завъртяните SQL заявки опитай се да решиш следната задачка:
Имаш таблица, в която има едно поле от тип float. задачата е да намериш произведението на числата от всички редове, без да използваш курсор, цикли и други неща подобни... само SELECT....
т.е ако имаш
1
2
3
заявката ти да върне 6
Аре. Успех!
Имаш таблица, в която има едно поле от тип float. задачата е да намериш произведението на числата от всички редове, без да използваш курсор, цикли и други неща подобни... само SELECT....
т.е ако имаш
1
2
3
заявката ти да върне 6
Аре. Успех!
Re: задачка за тебе
mysql> SELECT @r := 1;
+---------+
| @r := 1 |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT MAX(r) FROM (SELECT @r := @r * x AS r FROM t) AS t2;
+--------+
| MAX(r) |
+--------+
| 6 |
+--------+
1 row in set (0.01 sec)
Или без вложената заявка:
mysql> SELECT @r := 1;
mysql> SELECT @r := @r * x AS r FROM t ORDER BY r DESC LIMIT 1;
+------+
| r |
+------+
| 6 |
+------+
1 row in set (0.00 sec)
salle.online.bg/sig
+---------+
| @r := 1 |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT MAX(r) FROM (SELECT @r := @r * x AS r FROM t) AS t2;
+--------+
| MAX(r) |
+--------+
| 6 |
+--------+
1 row in set (0.01 sec)
Или без вложената заявка:
mysql> SELECT @r := 1;
mysql> SELECT @r := @r * x AS r FROM t ORDER BY r DESC LIMIT 1;
+------+
| r |
+------+
| 6 |
+------+
1 row in set (0.00 sec)
salle.online.bg/sig
Редактирано от salle на
Re: задачка за тебе
Хм... интересно...
Това май не бачка на MS SQL Server :).
Моето решение използва друг подход
Това май не бачка на MS SQL Server :).
Моето решение използва друг подход
SELECT EXP(sum_log)
FROM (
SELECT SUM(LOG(X)) as sum_log FROM t
) as p
Re: А защо ти е вложената заявка?
Абсолютно същото е като да напишеш
SELECT EXP(SUM(LOG(x))) as p FROM t;
salle.online.bg/sig
SELECT EXP(SUM(LOG(x))) as p FROM t;
salle.online.bg/sig
малка добавка
SELECT str_fld,
ISNULL(
(SELECT COUNT(DISTINCT X.str_fld)
FROM TTT AS X
WHERE LEFT(X.str_fld, 1) = LEFT(TTT.str_fld, 1)
AND X.str_fld < TTT.str_fld
)
, 0) + 1 AS Number
FROM TTT
Така ако имаме
АА
АА
АB
ще получим индексиране
АА 1
АА 1
АB 2.
В противен случай (COUNT *)
АА 1
АА 1
АB 3.
sunsande
P.S. : благодарско за задачата с умножението. Ще я помисля веднага щом ми остане време :) !