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

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


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

SQL Exercises

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

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

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

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе, который начинается после 138 задачи.

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


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

§ Провел очередную чистку рядов. Под раздачу попало около 1000 человек. Напомню, что удаляются "случайные" посетители, а именно, те, кто не был более года на сайте, решив при этом менее 15 задач.

§ Почтовые отправления с сайта закрыл картинкой. После этого я не получил ни одного письма-спама, отправленного с сайта.
Так что сертифицированным специалистам можно уже не опасаться разрешать отправления с сайта на свои адреса.

§ IAS56 решил 142 задачу. Ему осталось решить последнюю задачу, тогда место 12 можно будет сменить на место в десятке (время на третьем этапе - 20.130).
Gavrila решил добавленные задачи (13 место, время на третьем этапа .513).

§ Продвинулись в рейтинге:
burakov58 (задач 134, время 17.744)
runaway (131, 15.149)
_x_F1WC (131, 44.220)
modicus (130, 7.790)
elka (123, 53.183)
lexaNRJ (120, 52.709)

§ На этой неделе сертифицированы:
Dmit (A07018974) [BK] (г.Москва, Россия)
kasper_ (A07019703) [BK] (г.Симферополь, Украина)

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

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

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

Сертифицировано на сайте - 170-171

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Северюхин Ю.А. (Venser) 142 142 21 341 36 4.912 .655 14 08 Apr 2007 13 Jul 2007
2 Солдатенков Ю.С. (SolYUtor) 142 142 21 341 320 17.807 2.695 14 03 Apr 2007 20 Jul 2007
3 Шептунов П.П. (PavelPS) 142 142 21 341 119 8.145 3.499 14 25 Apr 2007 18 Jul 2007
4 Мурашкин И.В. (lepton) 142 142 21 341 371 15.737 5.539 14 29 Mar 2007 13 Jul 2007
5 Карасёва Н.В. (vlksm) 142 142 21 341 389 31.344 5.912 14 30 May 2007 20 Jul 2007
6 Мальцев А.В. (Палкин) 142 142 21 341 310 27.974 7.690 14 23 Jun 2007 20 Jul 2007
7 Голубин Р.С. (Roman S. Golubin) 142 142 21 341 588 55.391 34.203 14 29 Mar 2007 20 Jul 2007
8 Агапов В. (KERBEROS) 138 141 20 330 89 6.163 1.262 11 20 Nov 2006 09 Apr 2007
9 Кувалкин К.С. (Cyrilus) 141 141 20 336 901 12.541 2.519 11 14 May 2007 10 Jul 2007
10 Зверев Д.Л. (dimzv) 138 141 20 330 1141 9.294 4.938 11 19 Dec 2006 22 Dec 2006
11 Войнов П.Е. (pаparome) 141 142 21 337 616 2.765 .049 10 02 May 2007 29 Jun 2007
12 Любченко В.А. (IAS56) 141 142 21 337 313 176.801 20.130 10 14 Jul 2007 17 Jul 2007
13 Тарасов Д.Б. (Gavrila) 140 77 21 334 691 20.381 .513 7 18 Jul 2007 20 Jul 2007
14 Васьков Е.В. (Johan) 140 140 21 334 253 12.786 11.402 7 29 Mar 2007 16 Jun 2007
15 Валуев Д.И. (Fiolent) 139 140 20 329 1345 117.088 62.302 4 11 May 2007 20 Jul 2007
16 Юлдашев М.Р. (Snowbear) 139 139 21 330 642 4.132 .000 3 21 Apr 2007 20 Jul 2007
17 Креславский О.М. (Arcan) 139 139 21 330 67 9.932 .315 3 07 Apr 2007 20 Jul 2007
18 Держальцев В.А. (MadVet) 135 139 20 321 540 34.190 3.085 3 08 Oct 2006 19 Oct 2006
19 Палий С.А. (PS_Sergey) 136 139 20 322 212 15.704 4.188 3 01 Dec 2006 03 Dec 2006
20 Солопов А.Н. (15th) 138 138 21 327 125 16.082 .000 0 25 Apr 2007 18 Jul 2007

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Нарчук А.А. (Torchuck) 54 54 103 28 131 730 20 Jul 2007
2 Баскаков (XoXoXoX) 59 59 111 0 111 1049 15 Jul 2007
3 >Quinones A.B. (Ariel Quinones) 53 53 101 0 101 1271 19 Jul 2007
4 >Getman B.A. (BGladiator2007) 47 47 86 5 91 1558 20 Jul 2007
5 Takeshi (Yeo) 46 46 87 0 87 1648 19 Jul 2007
6 Хрусталева А.В. (Brutally) 41 41 74 1 75 1983 18 Jul 2007
7 >Holovko A. (andriy.holovko) 41 41 74 0 74 2030 20 Jul 2007
8 >Тхор А. (salaga) 36 38 70 1 71 2094 20 Jul 2007
9 >Гололобов (Victor) 35 35 64 0 64 2464 20 Jul 2007
10 >Soloydenko I.I. (sqlko!) 29 36 60 2 62 2255 20 Jul 2007
11 >Кольчугин (cur) 33 33 61 0 61 2604 20 Jul 2007
12 >Demin A.A. (Алексей Анатольевич) 33 33 60 0 60 2673 20 Jul 2007
13 >Лихобабин А.А. (madGluk) 26 58 53 4 57 561 20 Jul 2007
14 >Красовский (Pacific Ocean) 21 38 45 11 56 1916 20 Jul 2007
15 Лукьянов В.С. (Spider_51) 29 29 53 1 54 3130 17 Jul 2007
16 Demichev A.S. (dema) 32 32 52 0 52 3220 20 Jul 2007
17 Пименов Д.Н. (Dmitry77) 28 28 49 3 52 3225 19 Jul 2007
18 >Горланова М.Б. (MarG) 19 35 46 0 46 2428 20 Jul 2007
19 Овсянников В.Н. (0vsyannikoff Waldemar) 27 27 46 0 46 3665 18 Jul 2007
20 >Сорожкин (_wfl_) 27 27 46 0 46 3685 20 Jul 2007
21 Бартошевич А. (alexbarto) 24 24 37 8 45 3771 18 Jul 2007
22 >Knyazev A. (Knyazev Alexey) 21 77 44 0 44 307 20 Jul 2007
23 >Burago D. (kristobald) 7 57 18 26 44 577 20 Jul 2007
24 Ракчеев Р. (miragerr) 23 23 35 9 44 3805 18 Jul 2007

Изучаем SQL

Новые возможности T-SQL в SQL Server 2005 - Часть 2/3 (продолжение, начало в вып.146)

Kevin S. Goff, Microsoft MVP (оригинал: New T-SQL Capabilities in SQL Server 2005 - Part 2 of 3 )
Перевод Моисеенко С.И.

2 - РАНЖИРОВАНИЕ

Теперь мы хотим взять результаты предыдущего запроса (top N заказов по сумме для каждого служащего) и присвоить порядковый номер каждой строке в результирующем наборе. Это часто используется в приложениях, генерирующих отчеты, где необходима последовательная нумерация. (то есть. #1, #2, #3, и т.д.) До SQL Server 2005 разработчик либо должен был написать некоторый код, назначающий ранговый номер для каждой строки, либо вставить отсортированный результирующий набор в таблицу, содержащую ключ идентичности (identity). Хотя и реализуемый, этот процесс становился еще более трудным, если ранжируемый результирующий набор должен был быть сгруппирован в пределах другой сущности (например, переназначать ранговый номер каждый раз при изменении числа клиентов или служащих).

К счастью, T-SQL 2005 содержит новую функцию ROW_NUMBER(), которая делает эту задачу почти смехотворно простой!!! Для начала давайте изменим приведенный выше запрос (см. предыдущий выпуск рассылки - прим.перев.), чтобы присвоить общий ранговый номер каждой продаже из TOP 5 для каждого служащего:

DECLARE @nTop INT
SET @nTop = 5
SELECT Emp.EmployeeID, Emp.LoginID,
TopOrders.PurchaseOrderID, TopOrders.VendorID, TopOrders.OrderDate, TopOrders.TotalDue,
ROW_NUMBER() OVER ( ORDER BY TotalDue DESC) AS RankNum
FROM HumanResources.Employee Emp
CROSS APPLY [dbo].[GetTopPurchaseOrders] (Emp.EmployeeID,@nTop) AS TopOrders
ORDER BY RankNum

Этот код создаст результирующий набор, который пронумерует лучшие 5 заказов каждого служащего по общей причитающейся сумме (TotalDue) в порядке убывания. Отметьте для себя новую функцию ROW_NUMBER () OVER в операторе SELECT, которая добавляет ранговый номер к результирующему набору на основании убывания значения TotalDue:

ROW_NUMBER() OVER ( ORDER BY TotalDue DESC) AS RankNum

Если Вы хотите назначить последовательные номера в пределах служащего, Вы можете сгруппировать ранжирование, определив Partition в операторе:

ROW_NUMBER() OVER ( PARTITION BY Emp.EmployeeID ORDER BY TotalDue DESC) AS RankNum
ORDER BY Emp.EmployeeID, RankNum

Заметим, что в этом случае мы хотим упорядочить результирующий набор по столбцу RankNum в пределах EmployeeID.

Наконец, Вы можете столкнуться с ситуацией, когда порядок зависит от условия во время выполнения. Предположим, что нам необходимо назначить ранговые номера результирующему набору, когда порядок сортировки определяется одним из нескольких столбцов. Тут можно применить оператор CASE:

ROW_NUMBER() OVER (ORDER BY
CASE @SortCol
WHEN 'Column1' THEN Column1
WHEN 'Column2' THEN Column2
ELSE Column1 END)
AS RankNum

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

(продолжение следует...)

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

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

§ В продаже еще имеется книга SQL. Задачи и решения, посвященная анализу ошибок, допускаемых при решении задач первого этапа. На сайте издательства Питер можно сделать заказ и познакомиться с содержанием.

§ Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях:
del.icio.us
dzone.com
Digg.com
Reddit.com

Контакты

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

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

В избранное