Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru)


Информационный Канал Subscribe.Ru

Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 39 (11 июня 2005 г.)

http://www.sql-ex.ru

Новым посетителям сайта

Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 59-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


Новости сайта

§ Привели TOP 10 (на главной странице и странице с фотографиями) в соответствие с TOP 100.

§ Добавлена страница, на которой можно посмотреть оценку стоимости и план выполнения любого запроса. Пока заход на эту страницу идет по ссылке со страницы с упражнениями на SELECT с правильным (ОК) решением.

§ Число подписчиков - 2140

Число участников рейтинга - 3302

Число участников второго этапа - 324

Лучшие результаты (ТОР 20)

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 LastSolved LastVisit
1 Гонтовой В.А. (noname) 137 137 20 312 68 9.705 23 May 2005 05 Jun 2005
2 Галиаскаров Э.Г. (Galogen) 137 137 20 312 185 61.297 26 May 2005 06 Jun 2005
3 Валуев Д.И. (Fiolent) 136 137 20 310 630 26.470 26 May 2005 10 Jun 2005
4 Зверев Д.Л. (dimzv) 136 112 20 308 580 2.499 06 Jun 2005 09 Jun 2005
5 Кувалкин К.С. (Cyrilus) 135 137 20 308 167 5.020 10 May 2005 10 Jun 2005
6 Леденев С.А. (Shurgenz) 135 137 20 308 264 9.831 09 May 2005 07 Jun 2005
7 Мельникова И.А. (Iris_m) 135 41 20 308 380 89.865 27 May 2005 27 May 2005
8 Колосов А.С. (KAS) 134 137 20 306 25 3.398 11 Mar 2005 06 Jun 2005
9 Сныткин В.Л. (Ded I) 134 136 20 304 252 7.456 12 May 2005 10 Jun 2005
10 Рахманов И.Е. (bloom) 134 136 20 304 148 14.171 11 May 2005 23 May 2005
11 Hakobyan H.H. (hamlet) 134 136 20 304 220 37.869 07 May 2005 03 Jun 2005
12 Шипунов И. (IAS) 134 136 20 304 334 82.080 13 May 2005 26 May 2005
13 Иткин И.Л. (joseph_itkin) 132 136 20 299 375 2.849 07 Mar 2005 13 Apr 2005
14 Spirin (spirin) 131 136 19 296 158 13.461 21 Jan 2005 24 Jan 2005
15 Михайлов В.Г. (mslava) 132 136 17 293 648 10.504 25 Mar 2005 25 Mar 2005
16 Пятница О.А. (Robin) 125 128 20 287 754 74.630 19 Mar 2005 06 May 2005
17 Митронин А.А. (mitronin) 124 124 20 285 701 27.585 31 May 2005 01 Jun 2005
18 Gershovich (VIG) 120 122 20 277 805 10.525 25 May 2005 10 Jun 2005
19 Булаев В.В. (Kvix) 119 121 20 274 266 24.671 18 May 2005 18 May 2005
20 Тортумашев Е.А. (Johnny) 119 121 20 274 219 68.741 19 May 2005 01 Jun 2005

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Садовников А.Н. (raul) 59 59 107 1 108 257 10 Jun 2005
2 Буданов А.А. (ba) 35 57 72 9 81 353 10 Jun 2005
3 Luzhnov A. (Lartem) 30 53 58 23 81 411 10 Jun 2005
4 Гончаров В.В. (VaGon) 28 52 52 29 81 432 10 Jun 2005
5 >Михайлов В. (VOracle) 38 38 68 0 68 630 11 Jun 2005
6 Беклемишева (BekNatali) 16 60 37 15 52 253 10 Jun 2005
7 Ледянкин (Magneto) 24 47 43 0 43 529 10 Jun 2005
8 Цалиев Г.К. (Georg) 18 46 39 3 42 577 11 Jun 2005
9 Бевзюк А.А. (ABev.SQL) 17 79 40 0 40 104 11 Jun 2005
10 Нестерова О.Б. (oksla) 23 53 38 2 40 409 10 Jun 2005
11 Минеева О.С. (Lesya) 24 24 37 0 37 1098 10 Jun 2005
12 Елохина В.А. (e_Vik) 24 24 37 0 37 1107 10 Jun 2005
13 Алалыкин В.М. (BOBAH) 14 74 32 4 36 122 09 Jun 2005
14 Makedonsky (e_moe) 22 22 31 3 34 1306 10 Jun 2005
15 Mironov N.A. (Nikita Mironov) 17 59 32 0 32 258 10 Jun 2005
16 Мисюра А.А. (Antonn) 22 22 31 0 31 1302 06 Jun 2005
17 art A.A. (timofei) 18 27 26 3 29 1163 11 Jun 2005
18 Яруллин Т.Р. (cryomice) 20 27 24 3 27 1320 07 Jun 2005
19 Шалаев М.Г. (boo) 14 24 26 0 26 1123 10 Jun 2005
20 Пушкин Н.А. (phate) 19 19 25 0 25 1444 10 Jun 2005
21 >Глухов А.В. (Molodoy) 19 19 25 0 25 1456 11 Jun 2005
22 Филатов Д.Е. (demon) 7 41 20 0 20 683 10 Jun 2005

Изучаем SQL

Случайная выборка строк из таблицы в SQL Server 2000 (продолжение темы, начатой в вып.31 и 32)

Владимир Гершович (VIG) провел независимое расследование :-) и любезно предоставил мне результаты.
Суть его исследования состояла в том, чтобы выяснить насколько равномерными являются псевдослучайные последовательности, которые можно получить средствами SQL Server 2000.

Проблема равномерности важна, например, при выборе вопросов теста или подаче рекламных материалов. Вряд ли будет хорошо, если некий вопрос будет выпадать чаще других, или система будет отдавать предпочтение какому-либо рекламодателю при условии, что все платили поровну :-).

Итак, нам потребуется таблица с большим числом строк, откуда мы будем псевдослучайно выбирать значения.
Следующий код создает таблицу из 10000 строк, при этом первый столбец - это номер строки, а второй содержит последовательность значений от 0 до 0.9999 с шагом 0.0001 в представлении с плавающей точкой:

DECLARE @t TABLE(id_val INT, val FLOAT)
INSERT @t
SELECT 1000*a.n+100*b.n+10*c.n+d.n ,(1000*a.n+100*b.n+10*c.n+d.n)/10000.0
FROM
(SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
(SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,
(SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c,
(SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d

Понятие равномерного распределения на отрезке [0,1] соответствует представлению о случайном выборе точки на этом отрезке наудачу. Математическое ожидание и дисперсия равномерного распределения равны соответственно (1 + 0)/2 = 0.5 и (1 - 0)2/12 = 0.08333.
Итак, если мы случайным образом выберем последовательность значений из второго столбца и окажется, что их среднее значение равно 0.5, а дисперсия - 0.083333, то с большой долей вероятности можно утверждать, что наш метод дает равномерное распределение.

А вот кандидаты на исследование:

1. Использование функции NEWID()
2. Использование контрольной суммы от функции NEWID() - CHECKSUM(NEWID()). CHECKSUM используется для вычисления хеш-значения. За подробностями отсылаю к BOL и Гершовичу.
3. Использование функции RAND - RAND(ID_VAL * (1000 * DATEPART(mi,GETDATE()) + DATEPART(ms,GETDATE()))) ). Здесь в качестве начального значения для раскрутки псевдослучайной последовательности используются показания системных часов.

В теории вероятностей дисперсия равна квадрату стандартного отклонения (квадратичное отклонение!). В SQL Server имеется агрегатная функция, которая возвращает стандартное отклонение - STDEV, которая и позволит нам посчитать дисперсию. Наконец, проведем расчеты, выбирая 1000 значений из нашей таблицы и подсчитывая среднее значение и дисперсию:

SELECT AVG(val) Mean_NewID, POWER(STDEV(val),2) Disp_NewID
FROM
(SELECT TOP 1000 val
FROM @t t
ORDER BY NEWID()
) x

SELECT AVG(val) Mean_CheckSumNewID, POWER(STDEV(val),2) Disp_CheckSumNewID
FROM
(SELECT TOP 1000 val
FROM @t t
ORDER BY CHECKSUM(NEWID())
) x

SELECT AVG(val) Mean_Rand, POWER(STDEV(val),2) Disp_Rand
FROM
(SELECT TOP 1000 val
FROM @t t
ORDER BY RAND(id_val*(1000 * DATEPART(mi,GETDATE())+ DATEPART(ms,GETDATE())))
) x

Естественно, результаты будут отличаться для каждого выполнения запроса, т.к. всякий раз будет выбираться другая последовательность. Например,

1-й вариант 0.48206389999999955 8.4044806733524047E-2
2-й вариант 0.50844959999999972 8.0233888628468655E-2
3-й вариант 0.50142449999999994 8.3599687277026907E-2

Как видно, все варианты дают примерно одно и то же. Может показаться, что третий результат ближе к прогнозируемому. Однако если еще раз запустить запрос, то лучшим вполне может оказаться другой вариант. Чтобы выявить лидера, нужно еще накопить статистику. Однако главный вывод, как мне кажется, уже можно сделать: любой метод дает близкую к равномерной последовательность.

Автор проанализировал также распределение значений по интервалам. Однако поскольку там нет никаких неожиданностей, я больше не буду отрывать вас от других важных дел :-).

Полезная информация

Конкурс

§ Мы выставили наш сайт на конкурс Интернить 2005. Победитель определяется числом поданых голосов. Просьба проголосовать. (рекомендуемая оценка 3 :-)).

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.db.sqlex
Отписаться
Вспомнить пароль

В избранное