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

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


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

Выпуск 216 от 15 ноября 2008 г.

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

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

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

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

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


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

§ Оценка стоимости запросов в рейтинге по эффективности теперь берется из плана, построенного на отдельной проверочной базе, если таковая есть. План же на perfcon.php для всех запросов строится на общей проверочной базе.

§ На третий этап выставлена новая задача (150) от @Nikotin, под которую уже дважды добавлялись проверочные данные.

§ Неудобство, связанное с частой авторизацией на сайте, устранено; хостер пошел навстречу нашим просьбам и увеличил продолжительность сессии до 2,5 часов.

§ Реализован механизм подсказок. На время тестирования он работает пока только на рейтинговых этапах (SELECT).
Подсказки есть уже по следующим задачам: 15, 41, 42, 44, 53, 54, 72, 77, 78, 82, 83, 87, 90, 92, 95, 98, 102, 125.
Подсказка - это не алгоритм решения задачи и, тем более, не само решение. Это ответы, которые дает поддержка по характерным проблемам, связанным с решением задач. Поэтому, если задача имеет подсказку, то просьба дождаться ее доступности и не писать в поддержку, пока она не будет прочитана и принята во внимание при решении задачи.
Подсказка на первом этапе становится доступной, когда получен правильный результат на основной базе. На втором/третьем этапе, помимо этого, должно еще пройти некоторое время, вычисляемое исходя из среднего времени, потраченного на решение лидерами по данной задаче.

§ Завершили второй этап:
43. rem (задач 138, время 1.488) - лучший результат на втором этапе
44. TimonSP (138, 2,994)
46. Oxana (138, 73.424)
Одна задача до третьего этапа осталась:
52. D2NX (137, 538.490)

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
1. @Nikotin (150)
2. $erges (150)
24. mar_vi (142)
38. TimonSP (139, 142)

§ Новые лица в ТОР 100 и вернувшиеся туда:
95. GreyC (126, 25.107)

§ Продвинулись в рейтинге:
67. denzel (133, 209.042)
86. Vezyr (127, 25.590)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
106. Pavel_yu (125, 159.993)
140. B o r i s (120, 58.162)
150. Romul_T (118, 42.092)

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

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Никотин В.М. (@Nikotin) 150 150 21 364 74 7.665 3.751 40 09 Nov 2008 14 Nov 2008
2 Сальников С.А. ($erges) 150 150 21 364 259 3.320 3.824 40 11 Nov 2008 14 Nov 2008
3 Печатнов В.В. (pvv) 149 149 21 360 357 30.865 17.490 36 10 Oct 2008 14 Nov 2008
4 Селезнёв А.С. (Артём С.) 148 149 21 357 322 38.520 29.235 36 25 Sep 2008 06 Nov 2008
5 Креславский О.М. (Arcan) 149 149 21 360 617 48.147 36.296 36 08 Oct 2008 14 Nov 2008
6 Карасёва Н.В. (vlksm) 149 149 21 360 866 77.240 49.173 36 18 Sep 2008 14 Nov 2008
7 Держальцев В.А. (MadVet) 140 146 21 341 1257 60.815 28.482 28 24 Sep 2008 06 Oct 2008
8 Любченко В.А. (IAS56) 139 146 21 340 615 403.439 373.617 28 11 May 2008 12 Nov 2008
9 Мурашкин И.В. (lepton) 144 148 21 346 950 43.615 33.116 26 28 Oct 2008 10 Nov 2008
10 Голубин Р.С. (Roman S. Golubin) 143 145 21 343 1122 93.054 58.822 25 13 Sep 2008 11 Nov 2008
11 Nikolaenko A.V. (Shadow77) 145 147 21 347 436 77.520 14.010 23 22 Oct 2008 24 Oct 2008
12 Солдатенков Ю.С. (SolYUtor) 141 146 21 339 819 22.703 6.102 20 14 Aug 2008 23 Oct 2008
13 Белогурова К. (Katy_Ekb) 135 143 21 328 361 10.714 4.673 18 20 May 2008 16 Oct 2008
14 Егоров А.Б. (ABEgorov) 140 144 21 337 180 12.917 8.815 18 03 Aug 2008 12 Aug 2008
15 Зотов П.Г. (Ozzy) 141 143 21 338 229 40.955 58.553 18 25 Oct 2008 14 Nov 2008
16 Войнов П.Е. (pаparome) 142 146 21 338 1125 3.132 .213 17 22 Sep 2008 07 Oct 2008
17 Дроздков А.Н. (anddros) 143 145 21 341 140 4.236 .921 17 14 Oct 2008 14 Nov 2008
18 iglbeat (iglbeat) 140 145 21 336 360 34.601 15.225 17 08 Aug 2008 25 Aug 2008
19 Северюхин Ю.А. (Venser) 131 142 21 319 335 4.925 .655 14 01 Feb 2008 04 Feb 2008
20 Борисенков Д.В. (xuser) 140 142 21 332 261 3.346 .926 14 18 Oct 2008 14 Nov 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Korotenko N. (nkoroten) 57 57 106 2 108 1416 14 Nov 2008
2 Корзунин С.С. (Tarron) 29 53 61 34 95 923 14 Nov 2008
3 Polis (fishlesch3) 32 32 60 3 63 3376 14 Nov 2008
4 платон Т. (упырь) 27 44 59 0 59 2290 14 Nov 2008
5 Машков Д.А. (_dantist) 14 41 30 27 57 1289 13 Nov 2008
6 Акопов Д. (akopium) 30 30 54 0 54 4142 14 Nov 2008
7 Pitskhelauri B. (pitskhelauri) 23 34 53 0 53 3236 14 Nov 2008
8 Иванов А.В. (yadrinez) 22 33 50 0 50 3513 14 Nov 2008
9 Зернин (Endeavor) 26 26 49 0 49 4653 12 Nov 2008
10 Фоминых Ю.А. (yfominyh) 27 27 49 0 49 4665 14 Nov 2008
11 Dubrovskaya I. (Iryna) 18 67 30 17 47 613 14 Nov 2008
12 Мяконьких А.В. (Andy Miakonkikh) 21 21 37 9 46 5017 12 Nov 2008
13 Бондарев П.А. (Pavel_Bondarev) 20 32 45 0 45 3654 14 Nov 2008
14 Сенкевич С.В. (GreyC) 16 126 40 0 40 95 14 Nov 2008
15 Клушина О.Е. (Yoska) 18 24 34 0 34 5699 14 Nov 2008
16 Kutsevol (spiny) 20 20 34 0 34 6402 14 Nov 2008
17 vartanov (lexlex) 20 20 34 0 34 6413 13 Nov 2008
18 смольнякова А.А. (Acyaa) 13 25 33 0 33 4959 12 Nov 2008
19 Степаненко Н.С. (Micola) 13 13 15 17 32 6665 14 Nov 2008
20 Славутинский В.В. (Vasilko) 16 97 31 0 31 343 14 Nov 2008
21 Черняев К.В. (breezemaster1) 12 109 30 0 30 194 14 Nov 2008
22 Сидоренко Л.А. (lenny) 19 19 30 0 30 7105 12 Nov 2008

Изучаем SQL

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

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

Заметим, что функция PREVIOUS здесь ссылается на алиас точно такого же вычисления, что не разрешается в стандартном SQL. Другой вариант - поддержка прогрессивных вычислений с использованием функции LAG, но в нестандартной форме, которая допускает рекурсивную ссылку:

SELECT sort_col, data_col,
  CASE WHEN LAG(non_negative_sum, 1, 0)
              OVER(ORDER BY sort_col) + data_col < 0
         THEN 0
       ELSE LAG(non_negative_sum, 1, 0)
              OVER(ORDER BY sort_col) + data_col
  END AS non_negative_sum
FROM dbo.T1;

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

Заметим, что некоторые из задач, требующих прогрессивных вычислений, можно решить, используя стандартное предложения OVER. Например, Gordon Linoff - один из рецензентов данной статьи -предложил следующее хитроумное решение задачи неотрицательных сумм:

  • Вычисляем частичную сумму, используя sort_col, обзначим ее PARTSUM. Она включает и положительные, и отрицательные значения.
  • Вычисляем накопленный минимум частичной суммы, назовем его ADJUST. Он представляет собой несколько начальных положительных значений, за которыми следуют уменьшающиеся отрицательные значения.
  • Требуемое число будет разницей между PARTSUM и ADJUST, когда ADJUST - отрицательно.

На представленных данных результат выглядит так:

sortcol datacol partsum adjust  non_negative_sum
1 10 10 10 10
4 -15 -5 -5 0
5 5 0 -5 5
6 -10 -10 -10 0
8 -15 -25 -25 0
10 20 -5 -25 20
17 10 5 -25 30
18 -10 -5 -25 20
20 -30 -35 -35 0
31 20 -15 -35 20

Это можно выразить в SQL с использоваием ранее предложенных расширений (без прогрессивных вычислений) примерно так:

WITH C1 AS
(
  SELECT sort_col, data_col,
    SUM(datacol) OVER (ORDER BY sortcol
                       RANGE UNBOUNDED PRECEDING
                         AND CURRENT ROW
                      ) AS partsum
  FROM dbo.T1
),
WITH C2 AS
(
  SELECT *,
    MIN(partsum) OVER (ORDER BY sortcol
                       RANGE UNBOUNDED PRECEDING
                         AND CURRENT ROW
                      ) as adjust
  FROM C1
)
SELECT *,
  partsum - CASE WHEN adjust < 0 THEN adjust ELSE 0 END
    AS non_negative_sum
FROM C2;

Таким образом, расширение поддержки предложения OVER в стандартной форме уже позволит решить некоторые из этих задач. Однако некоторые вычисления, имеющие прогрессивную природу, не могут быть выполнены стандартным использованием предложения OVER. Кроме того, для таких вычислений естественная поддержка прогрессивных вычислений должна обеспечить лучшую производительность, чем использование стандартного предложения OVER; прогрессивные вычисления могут быть выполнены за один проход данных, тогда как стандартное использование предложения OVER может потребовать нескольких проходов, что мы видели в примере неотрицательных сумм.

Заключение

Цели этой статьи:

  • Убедить Microsoft в том, что расширение поддержки предложения OVER крайне необходимо, и что эти расширения должны иметь более высокий приоритет среди других рассматриваемых улучшений характеристик SQL Server
  • Обеспечить клиентов и пользователей SQL Server достаточным знанием и сведениями относительно предложения OVER (как существующих, так и отсутствующих элементов) для того, чтобы они могли понять, насколько полезно это предложение и просить Microsoft о расширении его поддержки

    Надеемся, эта статья поможет в достижении этих целей.

    Вот полный перечень расширений, который мы предлагаем, в порядке приоритетов:

    • ORDER BY для агрегатных функций
    • Функции LAG and LEAD
    • TOP OVER
    • Векторные выражения для вычислений с предложением OVER
    • Конструкторы окна ROWS and RANGE
    • DISTINCT для агрегатных функций
    • Функции FIRST_VALUE, LAST_VALUE
    • Прогрессивные вычисления на упорядоченыых данных

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

    ORDER BY для агрегатов

    функции LAG and LEAD

    TOP OVER

    Векторные выражения для вычислений на основе предложения OVER

    Оконные вспомогательные предложения ROWS и RANGE

    Предложение DISTINCT для агрегатных функций

    функции FIRST_VALUE, LAST_VALUE

    Прогрессивные (накопительные) вычисления

    Чем больше голосов, тем больше шансов, что Microsoft присвоит более высокий приоритет этим предложениям расширения поддержки.

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

    § Приглашаем вас посетить новый проект - Интерактивный учебник по SQL.
       Ресурс позиционируется как "справочное обеспечение" для сайта SQL-EX.RU, но может использоваться и независимо от него.

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

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

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

    Контакты

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

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

    В избранное