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

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


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

Выпуск 215 от 08 ноября 2008 г.

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

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

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

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

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


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

§ Выполнил компенсацию времени в связи с недоступностью сайта со 2 по 4 ноября.

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
30. mar_vi(140, 141)

§ Новые лица в ТОР 100 и вернувшиеся туда:
68. rem (131, 1.186) - второе время на промежуточном этапе
90. Vezyr (125, 23.780)

§ Продвинулись в рейтинге:
62. Eka (133, 15.101)
73.Bulldozer (131, 186.867)
82. lexaNRJ (128, 92.531)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
128. Mikha (121, 18.629)
147. B o r i s (119, 58.113)
187. GreyC (110, 22.335)

§ На этой неделе сертифицированы:
yabsql (A08039958) [BK] - г.Троицк, МО, Россия
AlShin (A08040682) [BK] - г.Москва, Россия
MarSi (A08035866) [BK] - г.Саяногорск, Хакасия, Россия

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

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

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

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

Сертифицировано на сайте - 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 Сальников С.А. ($erges) 149 149 21 360 248 3.183 3.688 36 31 Oct 2008 07 Nov 2008
2 Никотин В.М. (@Nikotin) 149 149 21 360 62 7.665 3.751 36 28 Oct 2008 07 Nov 2008
3 Печатнов В.В. (pvv) 149 149 21 360 357 30.865 17.490 36 10 Oct 2008 07 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 07 Nov 2008
6 Карасёва Н.В. (vlksm) 149 149 21 360 866 77.240 49.173 36 18 Sep 2008 07 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 28 Oct 2008
9 Мурашкин И.В. (lepton) 144 148 21 346 950 43.615 33.116 26 28 Oct 2008 29 Oct 2008
10 Голубин Р.С. (Roman S. Golubin) 143 145 21 343 1122 93.054 58.822 25 13 Sep 2008 01 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 07 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 07 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 07 Nov 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Муллаханов Р.Х. (rem) 63 131 146 0 146 68 07 Nov 2008
2 Grishanov A.M. (Alexey Grishanov) 51 51 97 34 131 938 07 Nov 2008
3 Лывин (v@n0) 38 38 72 19 91 1882 07 Nov 2008
4 Hidden A. (adziki) 36 36 68 15 83 2196 06 Nov 2008
5 >Kuznetsov P. (it4.kp) 31 31 62 19 81 2273 07 Nov 2008
6 >Салахов А.И. (cha0ss) 36 51 77 0 77 1696 07 Nov 2008
7 >Славутинский В.В. (Vasilko) 30 81 61 3 64 555 07 Nov 2008
8 Садовский А. (ArSad) 25 38 59 0 59 2705 06 Nov 2008
9 Dubrovskaya I. (Iryna) 17 49 40 17 57 1327 06 Nov 2008
10 >Уланов Д.А. (Mammonth) 22 38 53 0 53 1456 07 Nov 2008
11 Руппиев С.М. (Gray-Serg) 9 47 20 31 51 1109 06 Nov 2008
12 >Машков Д.А. (_dantist) 15 27 36 7 43 3949 07 Nov 2008
13 Корзунин С.С. (Tarron) 24 24 38 0 38 5922 07 Nov 2008
14 >Цапенкова О.С. (BlackSquirrel) 23 23 37 0 37 6054 07 Nov 2008
15 Заволокин (Real_Kent) 14 26 34 0 34 4518 01 Nov 2008
16 >Лягинская О. (Olg@) 20 20 34 0 34 6368 07 Nov 2008
17 Алемовская О.В. (1987) 13 25 33 0 33 4935 05 Nov 2008
18 >Шиндин А.В. (AlShin) 13 80 32 0 32 351 07 Nov 2008
19 >Башков А.В. (Freestyle) 9 40 19 10 29 1670 07 Nov 2008
20 Mostovoy (PahanSP) 6 21 12 17 29 4728 06 Nov 2008
21 >Neganov R. (ZNR) 17 17 29 0 29 7217 07 Nov 2008
22 Etigin (Fessy) 18 18 28 0 28 7406 06 Nov 2008
23 Кузнецов А.Г. (Alexus) 12 39 27 0 27 2548 07 Nov 2008
24 Санкевич (Don) 4 24 12 15 27 3710 07 Nov 2008
25 >Щудло Ф.М. (eksodus) 15 67 26 0 26 593 07 Nov 2008
26 Мечукаев Р.С. (Рустам-М) 4 37 9 17 26 1974 06 Nov 2008
27 Пинский О.А. (SQLTestEx) 12 31 26 0 26 3482 04 Nov 2008
28 Rukavishnikova (Miksa) 8 26 23 3 26 4387 05 Nov 2008
29 Afvbkbz B.J. (Gctdljybv) 11 23 25 0 25 5762 06 Nov 2008

Изучаем SQL

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

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

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

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

COUNT(DISTINCT <выражение>) OVER(<спецификация_over>)

vii. FIRST_VALUE, LAST_VALUE

FIRST_VALUE и LAST_VALUE - примеры двух других полезных функций, основанных на предложении OVER. Однако из всех функций, представленных до сих пор, эти будут, вероятно, наименее важными. Эти функции возвращают требуемое значение из первой/последней строки в группе (partition), где первая/последняя строка в группе, определяется предложением ORDER BY. Например, используя таблицу EmpOrders, предположим, что мы хотим вычислить разницу между количеством(qty) в текущей строке и количеством для работника за первый и последний месяц его трудовой деятельности. Простое использование MIN и MAX не хорошо здесь в виду того, что первый/последний здесь нужны в порядке ordermonth, а не в порядке qty(количества). Количество за первой месяц работы сотрудника не будет обязательно наименьшей величиной для него. Без функций FIRST_VALUE и LAST_VALUE, вы можете решить проблему, используя подзапросы с TOP (1):

SELECT empid, ordermonth, qty as qtythismonth,
  qty - (SELECT TOP(1) qty
         FROM dbo.EmpOrders AS I
         WHERE I.empid = O.empid
         ORDER BY I.ordermonth) AS diff_first,
  qty - (SELECT TOP(1) qty
         FROM dbo.EmpOrders AS I
         WHERE I.empid = O.empid
         ORDER BY I.ordermonth DESC) AS diff_last
FROM dbo.EmpOrders AS O;

Однако, каждое такой подзапрос потребовал бы поиска по индексу (считаем, что такой индекс создан). С функциями FIRST_VALUE и LAST_VALUE вы можете упростить решение, и, кроме того, вычисления могли бы выполняться один раз на группу (partition):

SELECT empid, ordermonth, qty as qtythismonth,
  qty - FIRST_VALUE(qty) OVER(PARTITION BY empid ORDER BY ordermonth)
    AS diff_first,
  qty - LAST_VALUE(qty) OVER(PARTITION BY empid ORDER BY ordermonth)
    AS diff_last
FROM dbo.EmpOrders;

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

viii. Последовательные вычисления на упорядоченных данных

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

Пример такой задачи представлен Marcello Poletti, SQL Server MVP. Дана следующая таблица T1:

USE tempdb;
GO
IF OBJECT_ID('dbo.T1') IS NOT NULL
  DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
  sort_col INT NOT NULL PRIMARY KEY,
  data_col INT NOT NULL
);
GO

INSERT INTO dbo.T1 VALUES(1,   10);
INSERT INTO dbo.T1 VALUES(4,  -15);
INSERT INTO dbo.T1 VALUES(5,    5);
INSERT INTO dbo.T1 VALUES(6,  -10);
INSERT INTO dbo.T1 VALUES(8,  -15);
INSERT INTO dbo.T1 VALUES(10,  20);
INSERT INTO dbo.T1 VALUES(17,  10);
INSERT INTO dbo.T1 VALUES(18, -10);
INSERT INTO dbo.T1 VALUES(20, -30);
INSERT INTO dbo.T1 VALUES(31,  20);

Предположим, вам нужно вычислить неотрицательные суммы data_col при упорядочении по sort_col. Сумма должна быть неотрицательной; если это не так, то вместо суммы ставим 0 и используем его для вычислений в следующей строке. Вот требуемый результат:

sort_col data_col non_negative_sum
1  10  10
4  -15  0
5  5  5
6  -10  0
8   -15  0
10  20  20
17  10  30
18  -10  20
20  -30  0
31  20  20

Существуют и другие задачи, требующие прогрессивных вычислений на упорядоченных данных, включая основанные на FIFO/LIFO условно-накопительные вычисления, некоторые типы запросов на базе временных (temporal) данных, и другие.

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

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

(Окончание следует...)

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

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

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

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

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

Контакты

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

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

В избранное