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

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


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

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

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

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

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

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


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

§ Автор (_Bkmz_) добавил проверочных данных для задачи 89.
$erges уточнил формулировку своей задачи 88.

§ Хотите поддержать проект?.
Вот инструкция по применению. :-)

§ Новые лица в ТОР 100 и вернувшиеся туда:
93. VOVA_KHILKO (125, 45.441)
94. Oxana (125, 48.266)

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
1. vlksm (149)
3. Артём С. (149)

§ Продвинулись в рейтинге:
40. Fencer (137, 216.135)
42. yoj (136, 13.950)
43. Fomichev (135, 19.385)
49. nebiros (135, 366.755)
72. HandKot_ (128, 235.620)
74. raul (129, 17.857)
95. Чих (125, 63.468)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
109. zjor (122, 111.669)
117. glassman (121, 22.776)
148. Pavel_yu (117, 111.354)
150. Demonius (113, 98.907)
158. Ashton (114, 13.573)
165. eli0n (113, 70.830)
171. B o r i s (111, 41.605)

§ На этой неделе сертифицированы:
dmx (A08031806) [BK] - г.Москва, Россия

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Карасёва Н.В. (vlksm) 149 149 21 363 866 77.241 49.173 36 18 Sep 2008 19 Sep 2008
2 Сальников С.А. ($erges) 148 54 21 361 196 2.854 3.359 34 09 Sep 2008 19 Sep 2008
3 Селезнёв А.С. (Артём С.) 147 149 21 357 314 34.395 25.110 33 17 Sep 2008 19 Sep 2008
4 Креславский О.М. (Arcan) 147 126 21 358 593 39.349 27.498 31 14 Sep 2008 19 Sep 2008
5 Печатнов В.В. (pvv) 146 126 21 355 332 19.702 6.326 28 15 Sep 2008 19 Sep 2008
6 Держальцев В.А. (MadVet) 139 146 21 343 1128 60.815 28.482 28 18 May 2008 07 Sep 2008
7 Любченко В.А. (IAS56) 139 146 21 343 615 403.439 373.617 28 11 May 2008 16 Aug 2008
8 Голубин Р.С. (Roman S. Golubin) 143 54 21 346 1122 93.054 58.822 25 13 Sep 2008 19 Sep 2008
9 Nikolaenko A.V. (Shadow77) 142 147 21 345 349 37.317 14.010 23 27 Jul 2008 18 Sep 2008
10 Мурашкин И.В. (lepton) 141 146 21 343 839 37.289 26.815 21 09 Jul 2008 18 Sep 2008
11 Солдатенков Ю.С. (SolYUtor) 141 146 21 342 819 22.703 6.102 20 14 Aug 2008 03 Sep 2008
12 Белогурова К. (Katy_Ekb) 135 143 21 331 361 10.714 4.673 18 20 May 2008 05 Sep 2008
13 Егоров А.Б. (ABEgorov) 140 144 21 340 180 12.917 8.815 18 03 Aug 2008 12 Aug 2008
14 Войнов П.Е. (pаparome) 140 146 21 339 1034 3.103 .213 17 23 Jun 2008 01 Sep 2008
15 iglbeat (iglbeat) 140 145 21 339 360 34.601 15.225 17 08 Aug 2008 25 Aug 2008
16 Северюхин Ю.А. (Venser) 131 142 21 322 335 4.925 .655 14 01 Feb 2008 04 Feb 2008
17 Борисенков Д.В. (xuser) 134 142 21 327 92 3.217 .926 14 02 May 2008 30 May 2008
18 Мишин С.А. (CepbIu) 137 142 21 331 69 9.772 2.148 14 26 Jun 2008 10 Sep 2008
19 Тарасов Д.Б. (Gavrila) 138 142 21 333 1069 24.230 2.501 14 30 Jul 2008 19 Sep 2008
20 Кувалкин К.С. (Cyrilus) 132 142 21 323 1207 13.037 2.782 14 15 Mar 2008 04 Sep 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Аро Диас Ф.Л. (Philosoff) 40 53 83 34 117 887 19 Sep 2008
2 Smirnov S. (hr) 48 48 91 0 91 1815 19 Sep 2008
3 >Комов Д.М. (Komov) 37 51 80 3 83 1559 19 Sep 2008
4 >Панзин М.А. (miсpan) 39 53 82 0 82 1581 19 Sep 2008
5 >Иванов И.И. (Testeee) 41 41 77 0 77 2400 19 Sep 2008
6 >Ольшанский А.В. (alx_ol) 29 29 57 0 57 3718 19 Sep 2008
7 Глумов Ф.С. (Глумов Федор) 26 26 49 0 49 4495 15 Sep 2008
8 прпоп (an24) 21 21 37 7 44 5055 19 Sep 2008
9 >Miscov (Vovano) 22 22 39 5 44 5065 19 Sep 2008
10 >efimov (vie) 24 24 44 0 44 5072 19 Sep 2008
11 >Ержуков В.В. (freid-pro) 25 25 43 0 43 5195 19 Sep 2008
12 >Tabachuk M. (Maxy) 25 65 42 0 42 1107 19 Sep 2008
13 >Anonym J.N. (habdl) 3 53 4 34 38 885 19 Sep 2008
14 Ерохин А. (_AERO_) 15 27 34 0 34 4702 17 Sep 2008
15 Валявкин В.Г. (Инженер) 14 28 33 0 33 4431 17 Sep 2008
16 >Сенкевич С.В. (GreyC) 19 59 32 0 32 785 19 Sep 2008
17 >Андреева С.А. (cvetochek) 8 34 18 14 32 2167 19 Sep 2008
18 Ivanov (alx1009) 10 31 20 12 32 2583 19 Sep 2008
19 >Бекишев Д. (BOKSH) 20 20 32 0 32 6455 19 Sep 2008
20 Пупкин (virus_sqlex) 19 19 31 0 31 6644 16 Sep 2008
21 gremlin (gremlin1) 11 11 12 19 31 6666 19 Sep 2008
22 >Vasiliev A. (Andrey_knit) 13 24 30 0 30 5423 19 Sep 2008

Изучаем SQL

Требования к SQL Server по усилению поддержки: предложение OVER() и упорядоченные вычисления (продолжение, начало в вып.195-199, 202-207)

Itzik Ben-Gan и Sujata Mehta (оригинал: SQL Server Feature Enhancement Request - OVER Clause and Ordered Calculations )
Перевод: Карасева Н.В.

Отсутствующие элементы предложения ANSI OVER -предисловие

Важно заметить, что предложение OVER, определенное в ANSI SQL: 1999, содержит дополнительные элементы, которые не реализованы в аналитических функциях SQL Server 2005.

Для того чтобы освежить нашу память, повторим синтаксис ANSI SQL для функций окна, использующих предложение OVER:

Function (аргумент)    (дополнительное предложение для окна)
OVER ([PARTITION BY <...>] [ORDER BY <...>] [ROWS/RANGE<…>])

В виду того, что PARTITION BY применяется для агрегатных функций в SQL Server 2005, мы можем получать агрегированные значения по разбиениям наряду с доступными атрибутами базовой строки. Элемент PARTITION BY упрощает решение некоторых задач. Однако если бы поддерживались подчиненные предложения ORDER BY и ROWS/RANGE, то можно было бы сделать ещё лучшие вещи!

Предложение ORDER BY позволило бы нам решить такие проблемы, как вычисление нарастающих итогов (подобных нашу примеру в разделе 1). Предложения ROWS/RANGE дали бы нам возможность определять изменяющиеся начальную и конечную границы окна, и мы могли бы вычислять скользящие агрегатные значения.

Давайте уясним себе цель применения элемента ORDER BY в этом аспекте. Ранее для SQL Server мы видели только одно назначение предложения ORDER BY - определение физического порядка записей в курсоре. Однако ANSI определяет еще одну функцию для ORDER BY -обеспечение логического порядка строк для вычислений в окне.

Согласно ANSI, предложение ORDER BY, в зависимости от его использования, служит одной из двух целей: определение физического порядка записей в курсоре или определение логического порядка следования строк в окне для оконных вычислений (однако эти два варианта не могут использоваться одновременно). Нам нужно по-разному определить предложение ORDER BY для каждой из функций. Эта возможность использования агрегатных функций для логически упорядоченных строк позволила бы нам решить много проблем, чего мы не можем сделать в текущей версии SQL Server.

В заключение, в этом разделе представлены реализация предложения OVER в SQL Server 2005 и типы задач, которые можно решать с его помощью. Предложение OVER - очень мощный инструмент в нашем арсенале SQL. Однако главная сила OVER ещё только должна прийти! Затем мы ещё подробнее рассмотрим элементы полного синтаксиса ANSI предложения OVER, отсутствующие в SQL Server 2005 для того, чтобы продемонстрировать необходимость полной поддержки в следующем релизе SQL Server.

РАЗДЕЛ 4: Требование к усилению поддержки - отсутствующие элементы предложения OVER в SQL Server в порядке их приоритета.

В этом разделе рассмотрены отсутствующие элементы предложения OVER, которые существуют в ANSI SQL: 2003, других платформах баз данных (например, Oracle, DB2), или предлагаемых расширениях T-SQL, в порядке приоритетов: от наиболее важных элементов к менее важным.

i. ORDER BY для агрегатных функций

Это самый важный отсутствующий элемент. Настоящая сила предложения OVER именно в дополнительном предложении ORDER BY. Это хорошо, что в SQL Server реализована поддержка PARTITION BY, однако главный смысл - в элементе ORDER BY. Ранее показано, что определение элемента ORDER BY без элементов конструкции окна, по умолчанию предполагает вариант окна для ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW (СТРОКИ МЕЖДУ КАЖДОЙ ПРЕДШЕСТВУЮЩЕЙ И ТЕКУЩЕЙ СТРОКОЙ). Обеспечение поддержки предложения ORDER BY для агрегатных функций с опцией окна по умолчанию было бы уже значительным шагом вперед, даже если на первом этапе не реализовывать поддержку явного задания опции, а сделать её на следующих этапах.

Использование элемента ORDER BY для агрегатных вычислений простирается значительно дальше тривиального сценария вычисления агрегатов с накоплением; агрегаты с нарастающим итогом используются в различных типах задач не как конечная цель, а как средство на пути к решению. Использование агрегатов с нарастающим итогом было описано выше и является очевидным. Вот ранее приведенный пример:

SELECT empid, ordermonth, qty,
  SUM(qty) OVER(PARTITION BY empid
                ORDER     BY ordermonth) AS cumulativeqty
FROM EmpOrders;

Примеры использования агрегатов с накоплением как конечного средства включают сценарии решения задач инвентаризации, баланса банковских транзакций, темпоральных задач и т.д.

Инвентаризация/баланс банковских транзакций:

Предположим, у вас есть таблица InventoryTransactions со столбцами productid, dt, и qty. В колонке qty находятся добавленные количества (знак плюс) или изъятые количества (знак минус) некоторого продукта. Вам нужно вывести изменение накопленных количеств для каждого продукта для каждого момента времени из заданного диапазона дат. Вы можете использовать следующий запрос:

SELECT productid, dt, qty,
  SUM(qty) OVER(PARTITION BY productid
                ORDER     BY dt) AS cum_qty_change
FROM InventoryTransactions
WHERE dt >= @dt1 AND dt < @dt2;

Очень похожую принципиальную схему можно применить и для банковских транзакций при вычислении балансов.

В этих примерах использование агрегатов с накоплением очевидно. Существуют задачи, для решений которых, на первый взгляд, не нужно применение агрегатов с накоплением, но их можно использовать для оптимизации, а иногда и для упрощения решения. Следующий пример, заимствованный из книги Inside Microsoft SQL Server 2005 by Itzik Ben-Gan, Dejan Sarka and Roger Wolter (MSPress, 2006), демонстрирует это:

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

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

§ Онлайновый выпуск рассылки можно почитать на сайте.

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

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

Контакты

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

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

В избранное