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

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


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

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

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

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

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

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


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

§ Реализовали раскраску скриптов на форуме. За основу взят базовый стиль Management Studio SS2005.
Скрипт раскрашивается, если вставить его в а-ля редакторе (кнопка Новое). Чтобы раскрасить скрипт при использовании быстрого ответа, нужно вручную заключить его в теги [src][/src]. Раскраска работает, если тег [src] не включается в другие теги и не содержит внутри себя других тегов.
Далеко не уверен, что используемый словарь ключевых слов полон. Поэтому просьба сообщать, если что-то не так будет окрашиваться.
Исправлен баг с редактированием сообщений на форуме.

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
10. SolYUtor (145, 146)
11. Артём С. (145, 146)
29. Ozzy (140)

§ Одна задача до третьего этапа осталась:
40. mz (задач 137, время 31.554)

§ Новые лица в ТОР 100 и вернувшиеся туда:
95. yaff (122, 14.930)
100. Лори (125, 29.348)

§ Продвинулись в рейтинге:
44. Fencer (137, 213.858)
47. Scorpion (136, 84.700)
49. rage (135, 1.927) - третий результат на промежуточном этапе
52. Fomichev (135, 17.471)
58. Umrikhina (133, 3.243)
60. denzel (133, 115.907)
69. Eka (130, 13.419)
83. shadon (128, 23.705)
84. Shurgenz (128, 12.665)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
142. yoj (118, 9.096)
170. eli0n (111, 70.503)
174. D-m-i-t-r-y (110, 29.841)

§ На этой неделе сертифицированы:
Seventh (A08007897) [BK] - г.Львов, Украина
igmar (A08033141) [BK] - г.Москва, Россия

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

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

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

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

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

Лучшие результаты (ТОР 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) 147 147 21 357 118 2.842 3.359 31 23 Jun 2008 15 Aug 2008
2 Креславский О.М. (Arcan) 147 147 21 357 517 37.671 27.498 31 30 Jun 2008 15 Aug 2008
3 Карасёва Н.В. (vlksm) 147 147 21 357 778 73.340 46.383 31 22 Jun 2008 15 Aug 2008
4 Печатнов В.В. (pvv) 146 146 21 354 257 19.426 6.326 28 02 Jul 2008 14 Aug 2008
5 Держальцев В.А. (MadVet) 142 146 21 347 1128 60.815 28.482 28 18 May 2008 15 Aug 2008
6 Любченко В.А. (IAS56) 142 146 21 347 615 403.439 373.617 28 11 May 2008 08 Jun 2008
7 Голубин Р.С. (Roman S. Golubin) 144 145 21 348 1044 92.981 58.822 25 27 Jun 2008 09 Aug 2008
8 Nikolaenko A.V. (Shadow77) 145 147 21 349 349 37.317 14.010 23 27 Jul 2008 01 Aug 2008
9 Мурашкин И.В. (lepton) 144 146 21 347 839 37.289 26.815 21 09 Jul 2008 22 Jul 2008
10 Солдатенков Ю.С. (SolYUtor) 144 146 21 346 819 22.703 6.102 20 14 Aug 2008 14 Aug 2008
11 >Селезнёв А.С. (Артём С.) 144 146 21 346 281 18.546 6.728 20 15 Aug 2008 15 Aug 2008
12 Белогурова К. (Katy_Ekb) 138 143 21 335 361 10.714 4.673 18 20 May 2008 31 Jul 2008
13 Егоров А.Б. (ABEgorov) 143 140 21 344 180 12.917 8.815 18 03 Aug 2008 12 Aug 2008
14 Войнов П.Е. (pаparome) 143 146 21 343 1034 3.103 .213 17 23 Jun 2008 15 Aug 2008
15 iglbeat (iglbeat) 143 145 21 343 360 34.601 15.225 17 08 Aug 2008 08 Aug 2008
16 Северюхин Ю.А. (Venser) 134 142 21 326 335 4.925 .655 14 01 Feb 2008 04 Feb 2008
17 Борисенков Д.В. (xuser) 137 142 21 331 92 3.217 .926 14 02 May 2008 30 May 2008
18 Мишин С.А. (CepbIu) 140 142 21 335 69 9.772 2.148 14 26 Jun 2008 01 Aug 2008
19 Тарасов Д.Б. (Gavrila) 141 142 21 337 1069 24.230 2.501 14 30 Jul 2008 01 Aug 2008
20 Кувалкин К.С. (Cyrilus) 135 142 21 327 1207 13.037 2.782 14 15 Mar 2008 07 Aug 2008

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Samokhina A.M. (TmpFile()) 34 46 72 17 89 1550 15 Aug 2008
2 Толмачев С.А. (Сергей Толмачев) 41 41 78 0 78 2453 15 Aug 2008
3 Лысиков М.Ю. (Ashton) 19 67 36 31 67 580 15 Aug 2008
4 Флягин М.В. (PBA) 29 52 63 2 65 1628 14 Aug 2008
5 Бартов О.Б. (Oldbar) 31 37 63 0 63 2939 15 Aug 2008
6 Рыбин С.Н. (SysAdminEkt) 26 26 42 9 51 4322 15 Aug 2008
7 lucifer (lucifer) 22 35 50 0 50 3268 14 Aug 2008
8 Широкова (Mashutka) 14 40 27 22 49 1658 09 Aug 2008
9 Русских (runik123) 23 40 48 0 48 2651 15 Aug 2008
10 Соколов А. (Andrey Sokolov) 26 26 47 0 47 4783 14 Aug 2008
11 Колечкин С.А. (Fin da mix) 8 58 12 34 46 810 15 Aug 2008
12 Puchajda B.W. (boges) 18 47 45 0 45 1466 14 Aug 2008
13 tsai E.I. (jenka1411) 13 19 23 17 40 4931 15 Aug 2008
14 Шкаренков М.С. (Sw@sud) 26 26 39 0 39 5666 15 Aug 2008
15 Москаленко О.И. (Bad Lulu) 18 29 38 0 38 4400 15 Aug 2008
16 Мустафин И.И. (krasik86ru) 20 27 38 0 38 4927 15 Aug 2008
17 Гончаров Д.С. (int18h) 20 20 28 9 37 5880 15 Aug 2008
18 Gubanov A.A. (Zapros) 12 43 29 4 33 1668 15 Aug 2008
19 Якушев Е.А. (E } | { U) 9 27 17 16 33 3283 13 Aug 2008
20 Zolotarev (SergZ) 15 42 32 0 32 2479 13 Aug 2008
21 Kiselev I. (darkman666) 9 77 23 8 31 400 15 Aug 2008
22 Поликарпов (s.pereira) 12 64 20 11 31 675 15 Aug 2008
23 Панов Р.Р. (Ratmir) 14 35 31 0 31 3261 12 Aug 2008
24 Емельянов К.С. (gipsy) 12 32 31 0 31 3627 15 Aug 2008
25 Real (Man_Vik) 13 23 30 0 30 5368 14 Aug 2008

Изучаем SQL

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

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

Функция ROW_NUMBER:

Для нумерации записей в SQL Server 2005 используется функция ROW_NUMBER. ROW_NUMBER выдает последовательные целые числа для строк результирующего набора запроса согласно порядку, определяющему позицию строки по отношению к другим строкам результирующего набора (или дополнительно для разбиений). Нумерация всегда начинается с 1 и увеличивается на единицу для каждой следующей строки в соответствии с заданной сортировкой. Функция ROW_NUMBER имеет широкое практическое применение, выходящее далеко за пределы классического разбиения на страницы, вывода n первых строк на основе критерия сортировки в пределах разбиений, подсчета существующих и отсутствующих диапазонов данных, вычисления медианных значений, сортировки иерархических структур и т.д.

Функции RANK() и DENSE_RANK:

Функции RANK() и DENSE_RANK в SQL Server 2005 похожи на функцию ROW_NUMBER тем, что их значения - целочисленные ранги строк результирующего набора, зависящие от заданного списка сортировки. Однако функция ROW_NUMBER дает для каждой строки отличные значения. Значения же функций RANK и DENSE_RANK одинаковы для всех строк, имеющих совпадающие значения в списке столбцов, по которым выполняется сортировка.

Значение функции RANK основано на количестве строк, имеющих меньшие значения по указанным в списке ORDER BY полям, +1. Строки с равными значениями в столбцах сортировки получают одно и то же значение RANK, и значения функции RANK могут иметь пропуски.

Значение DENSE_RANK основано на количестве различных строк, имеющих меньшие значения по столбцам сортировки, +1. Записи с равными значениями в полях сортировки получают одно и то же значение; значения функции DENSE_RANK не имеют пропусков.

Функция NTILE:

Функция NTILE разделяет набор данных (возможно, внутри разбиений) на указанное количество групп (n), назначая номер группе от 1 до n согласно указанной сортировке. Число строк в группе определяется следующим образом: (число строк)/n (целочисленное деление). Если остаток от деления равен r, то дополнительная строка добавляется к первым r группам.

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

-----------------------------------------------------------------------
--Аналитические ранжирующие функции
-- Создание и заполнение таблицы Orders
-----------------------------------------------------------------------

USE tempdb;
GO

IF OBJECT_ID('dbo.Orders') IS NOT NULL
  DROP TABLE dbo.Orders;
GO

CREATE TABLE dbo.Orders
(
  orderid   INT        NOT NULL,
  orderdate DATETIME   NOT NULL,
  empid     INT        NOT NULL,
  custid    VARCHAR(5) NOT NULL,
  qty       INT        NOT NULL,
  CONSTRAINT PK_Orders PRIMARY KEY NONCLUSTERED(orderid)
);

CREATE UNIQUE CLUSTERED INDEX idx_UC_orderdate_orderid
  ON dbo.Orders(orderdate, orderid);

SET NOCOUNT ON;
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(30001, '20030802', 3, 'B', 10);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(10001, '20031224', 1, 'C', 10);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(10005, '20031224', 1, 'A', 30);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(40001, '20040109', 4, 'A', 40);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(10006, '20040118', 1, 'C', 10);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(20001, '20040212', 2, 'B', 20);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(40005, '20040212', 4, 'A', 10);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(20002, '20040216', 2, 'C', 20);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(30003, '20040418', 3, 'B', 15);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(30004, '20040418', 3, 'B', 20);
INSERT INTO dbo.Orders(orderid, orderdate, empid, custid, qty)
  VALUES(30007, '20040907', 3, 'C', 30);
GO
SELECT * FROM Orders;
-----------------------------------------------------------------------

Результат запроса показан в таблице 3-2.

Orderid orderdate   empid   custid  qty
30001 8/2/2003 3 B 10
10001 12/24/2003 1 C 10
10005 12/24/2003 1 A 30
40001 1/9/2004 4 A 40
10006 1/18/2004 1 C 10
20001 2/12/2004 2 B 20
40005 2/12/2004 4 A 10
20002 2/16/2004 2 C 20
30003 4/18/2004 3 B 15
30004 4/18/2004 3 B 20
30007 9/7/2004 3 C 30

Таблица 3-2.  Содержимое таблицы  Orders

Давайте применим предложение OVER для всех 4 функций ранжирования как с конструкцией PARTITION BY, так и без неё, для демонстрации их использования и уяснения разницы между ними.

-----------------------------------------------------------------
--Аналитические ранжирующие функции
-- без PARTITION BY
-----------------------------------------------------------------

SELECT orderid, qty,
  ROW_NUMBER() OVER(ORDER BY qty) AS rownum,
  RANK()       OVER(ORDER BY qty) AS rnk,
  DENSE_RANK() OVER(ORDER BY qty) AS densernk,
  NTILE(4)     OVER(ORDER BY qty) AS ntile4
FROM dbo.Orders
ORDER BY qty;

GO
-----------------------------------------------------------------

orderid qty rownum  rnk densernk    ntile4
30001 10 1 1 1 1
10001 10 2 1 1 1
10006 10 3 1 1 1
40005 10 4 1 1 2
30003 15 5 5 2 2
30004 20 6 6 3 2
20002 20 7 6 3 3
20001 20 8 6 3 3
10005 30 9 9 4 3
30007 30 10 9 4 4
40001 40 11 11 5 4

Таблица 3-3 Аналитические ранжирующие функции без разбиений

Результаты приведены в таблице 3-3, и по ним видны отличия функций ранжирования. Если мы посмотрим на результаты, то номера строк (rownum) последовательно возрастают и не зависят от того, меняется значение сортировки или нет, т.е. значения столбца rownum получают свои значения на основе упорядочения по столбцу qty и сохраняют приращение 1, даже если значение qty не изменяется. RANK дает одинаковые значения в столбце rnk, если значения столбца qty одинаковы, но при изменении значения qty значения rnk подскакивают. Значения DENSE_RANK одинаковы для совпадающих значений qty, но когда qty увеличивается, приращение DENSE_RANK равно 1 и значения этой функции не имеют пропусков. NTILE разделяет результирующий набор на заданное число групп, в нашем случае - 4 (NTILE (4)). Строки результирующего набора равномерно распределяется по количеству разбиений (11/4 = 2). Оставшиеся строки (остаток равен 3), распределяются по одной, начиная с первой группы, пока строки не закончатся (поэтому число строк в первых трех группах равно 2+1 = 3).

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

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

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

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

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

Контакты

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

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

В избранное