задачка

9 отговора 920 прегледа
#1

задачка

Привет.

Имаме таблица, в която данните могат да се разделят на групи. Например :

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

Отговор
в отговор на sunsande #2

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/]

Отговор
в отговор на sunsande #3

м/у другото

Я дай да ти видим решението, че като ти гледам въпроса искаш да се похвалиш с нещо гениално .
Чакам

Отговор
в отговор на darklord #4

Re: м/у другото

Не мога да се похваля с нищо гениално :)
От време навреме научавам или се досещам за някой трик и това е ...
но тази задача не успях да реша.

Браво за решението и благодарско !

sunsande

Отговор
в отговор на sunsande #5

задачка за тебе

Щом си любител на завъртяните SQL заявки опитай се да решиш следната задачка:
Имаш таблица, в която има едно поле от тип float. задачата е да намериш произведението на числата от всички редове, без да използваш курсор, цикли и други неща подобни... само SELECT....
т.е ако имаш
1
2
3

заявката ти да върне 6

Аре. Успех!

Отговор
в отговор на darklord #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

Редактирано от salle на

Отговор
в отговор на salle #7

Re: задачка за тебе

Хм... интересно...
Това май не бачка на MS SQL Server :).
Моето решение използва друг подход

SELECT EXP(sum_log)
FROM (
SELECT SUM(LOG(X)) as sum_log FROM t
) as p


Отговор
в отговор на darklord #8

Re: А защо ти е вложената заявка?

Абсолютно същото е като да напишеш

SELECT EXP(SUM(LOG(x))) as p FROM t;

salle.online.bg/sig
Отговор
в отговор на darklord #9

малка добавка


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. : благодарско за задачата с умножението. Ще я помисля веднага щом ми остане време :) !

Отговор
в отговор на salle #10

Re: А защо ти е вложената заявка?

new4aq5hgykk7

Отговор