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

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


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

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

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

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

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

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


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

§ Выставил простую задачу на обучающий этап; ее номер 41.

§ Автор ($erges) усилил проверку задачи 15 в ответ на сообщение от fix4fix.

§ Произошло обновление задач и изменение сертификационных требований:
- перенесены на обучающий этап задачи 13,53,54;
- старая задача 52 теперь имеет номер 13; под номером 52 теперь находится старая задача 88 (сложность ее понижена до 1 балла);
- старая задача 126 теперь имеет номер 53 (сложность 1);
- новая задача от нового автора Ozzy выставлена под номером 54 (сложность 1);
- новая задача от vlksm выставлена третьем этапе под номером 148 (сложность 3);
- новые задачи oт $erges выставлены под номерами 88 (сложность 1), 126 (сложность 3 балла) и 149 (сложность 3);
- второй рейтинговый этап теперь начинается с задачи 52.
- просроченные заказы сертификатов удалены.

§ Одна задача до 3 этапа осталась:
42. Umrikhina (задач 137, время 5.343)

§ Новые лица в ТОР 100 и вернувшиеся туда:
99. D-m-i-t-r-y (122, 45.722)

§ Продвинулись в рейтинге:
59. wasp (131, 129.965)
85. HandKot_ (125, 230.690)
92. shock (124, 18.346)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
109. zjor (120, 103.298)
133. Mikha (117, 9.776)
134. Oxana (117, 35.907)
161. Robin (109, 164.181)
177. VOVA_KHILKO (107, 37.664)

§ На этой неделе сертифицированы:
alp13 (A08029025) [BK] - г.Донецк, Украина
D-m-i-t-r-y (B08025346) [AR] - г.Москва, Россия

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

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

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

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

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

Лучшие результаты (ТОР 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) 144 147 21 353 118 2.842 3.359 31 23 Jun 2008 05 Sep 2008
2 Креславский О.М. (Arcan) 144 147 21 353 517 37.671 27.498 31 30 Jun 2008 05 Sep 2008
3 Карасёва Н.В. (vlksm) 144 147 21 353 778 73.340 46.383 31 22 Jun 2008 05 Sep 2008
4 Печатнов В.В. (pvv) 143 146 21 350 257 19.426 6.326 28 02 Jul 2008 05 Sep 2008
5 Держальцев В.А. (MadVet) 139 146 21 343 1128 60.815 28.482 28 18 May 2008 05 Sep 2008
6 Любченко В.А. (IAS56) 139 146 21 343 615 403.439 373.617 28 11 May 2008 16 Aug 2008
7 Голубин Р.С. (Roman S. Golubin) 141 145 21 344 1044 92.981 58.822 25 27 Jun 2008 01 Sep 2008
8 Селезнёв А.С. (Артём С.) 142 146 21 346 290 21.239 9.420 24 24 Aug 2008 05 Sep 2008
9 Nikolaenko A.V. (Shadow77) 142 147 21 345 349 37.317 14.010 23 27 Jul 2008 01 Aug 2008
10 Мурашкин И.В. (lepton) 141 146 21 343 839 37.289 26.815 21 09 Jul 2008 22 Jul 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 01 Aug 2008
19 Тарасов Д.Б. (Gavrila) 138 142 21 333 1069 24.230 2.501 14 30 Jul 2008 05 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 >Никотин В.М. (@Nikotin) 53 65 108 34 142 568 05 Sep 2008
2 Koziev E. (eek) 33 33 67 0 67 2965 03 Sep 2008
3 Никифоров А.П. (Arni) 28 38 62 0 62 2619 02 Sep 2008
4 >Полтавец Л. (lilyok) 25 38 58 0 58 2624 05 Sep 2008
5 >Горшунов С. (_gsv_) 16 37 39 17 56 1917 05 Sep 2008
6 Antanevich Y. (Avtolic) 23 41 55 1 56 2070 04 Sep 2008
7 >Купреев В.В. (durfS) 30 30 56 0 56 3779 05 Sep 2008
8 >Пятаков (Gluttton) 14 40 33 22 55 1482 05 Sep 2008
9 >Бурлакова Н.С. (n.burlakova) 28 28 52 0 52 4154 05 Sep 2008
10 >zherebkina O. (Helga2) 25 25 45 0 45 4963 05 Sep 2008
11 >Евтисов С.С. (Minimal) 21 43 43 0 43 1128 05 Sep 2008
12 Писаренко Д.Н. (dimaP) 24 26 42 0 42 4721 05 Sep 2008
13 Черепанова А.А. (ChereS) 20 26 39 0 39 4821 05 Sep 2008
14 >Хилько В.М. (VOVA_KHILKO) 15 107 37 0 37 177 05 Sep 2008
15 >Свиридов К.Ю. (orange) 17 68 35 0 35 491 05 Sep 2008
16 PVE (PVE) 13 13 35 0 35 5997 02 Sep 2008
17 krstov V. (veco) 14 26 34 0 34 4730 05 Sep 2008
18 >Gulina M.V. (proliv) 19 56 33 0 33 1442 05 Sep 2008
19 Щекин Я.В. (Yaroslav_Schekin) 21 21 33 0 33 6303 04 Sep 2008
20 >Mujiri V. (vaxenzi) 15 22 28 3 31 5783 05 Sep 2008

Изучаем SQL

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

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

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

Задачи отсутствующих или имеющихся диапазонов значений возникают во многих производственных системах в разных формах, например, в отчетах о наличии/отсутствии. Это могут быть отсутствующие данные целого типа (integer) или типа даты/времени (datetime) . Решение приводится ниже.

---------------------------------------------------------------------
--  Отсутствующие и присутствующие диапазоны данных
--  или горы и долины
---------------------------------------------------------------------
SET NOCOUNT ON;
GO
IF OBJECT_ID('dbo.T1') IS NOT NULL
  DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1(col1 INT NOT NULL PRIMARY KEY);
GO
INSERT INTO dbo.T1 VALUES(1);
INSERT INTO dbo.T1 VALUES(2);
INSERT INTO dbo.T1 VALUES(3);
INSERT INTO dbo.T1 VALUES(100);
INSERT INTO dbo.T1 VALUES(101);
INSERT INTO dbo.T1 VALUES(102);
INSERT INTO dbo.T1 VALUES(103);
INSERT INTO dbo.T1 VALUES(500);
INSERT INTO dbo.T1 VALUES(997);
INSERT INTO dbo.T1 VALUES(998);
INSERT INTO dbo.T1 VALUES(999);
INSERT INTO dbo.T1 VALUES(1000);
GO

--Долины, решение на  2000

SELECT col1 + 1 AS start_range,
  (SELECT MIN(col1) FROM dbo.T1 AS B
   WHERE B.col1 > A.col1) AS end_range
FROM dbo.T1 AS A
WHERE NOT EXISTS
  (SELECT * FROM dbo.T1 AS B
   WHERE B.col1 = A.col1 + 1)
  AND col1 < (SELECT MAX(col1) FROM dbo.T1);

-- Долины, 2005, решение с  номерами строк

WITH C AS
(
  SELECT col1, ROW_NUMBER() OVER(ORDER BY col1) AS rn
  FROM dbo.T1
)
SELECT Cur.col1 + 1 AS start_range, Nxt.col1 - 1 AS end_range
FROM C AS Cur
  JOIN C AS Nxt
    ON Nxt.rn = Cur.rn + 1
WHERE Nxt.col1 - Cur.col1 > 1;

-- Горы, решение на 2000

SELECT MIN(col1) AS start_range, MAX(col1) AS end_range
FROM (SELECT col1,
        (SELECT MIN(col1) FROM dbo.T1 AS B
         WHERE B.col1 >= A.col1
           AND NOT EXISTS
             (SELECT * FROM dbo.T1 AS C
              WHERE C.col1 = B.col1 + 1)) AS grp
      FROM dbo.T1 AS A) AS D
GROUP BY grp;

--Горы, 2005, решение с  номерами строк

SELECT MIN(col1) AS start_range, MAX(col1) AS end_range
FROM (SELECT col1, col1 - ROW_NUMBER() OVER(ORDER BY col1) AS grp
      FROM dbo.T1) AS D
GROUP BY grp;
GO
---------------------------------------------------------------------

Приведенные выше примеры показывают, что решения на SQL Server 2000 не только не понятны интуитивно, но и демонстрируют неудовлетворительную производительность. Решение для SQLServer 2005 значительно проще и производительней.

---------------------------------------------------------------------
-- Вычисления медианы
---------------------------------------------------------------------

-- Решение на SQL Server 2000
USE pubs;
GO

IF OBJECT_ID('dbo.fn_median') IS NOT NULL
  DROP FUNCTION dbo.fn_median;
GO

CREATE FUNCTION dbo.fn_median(@stor_id AS CHAR(4)) RETURNS NUMERIC(11, 1)
AS
BEGIN
  RETURN
    (
     (SELECT MAX(qty) FROM
        (SELECT TOP 50 PERCENT qty FROM dbo.sales
         WHERE stor_id = @stor_id
         ORDER BY qty) AS H1)
     +
     (SELECT MIN(qty) FROM
        (SELECT TOP 50 PERCENT qty FROM dbo.sales
         WHERE stor_id = @stor_id
         ORDER BY qty DESC) AS H2)
    ) / 2.
END
GO

SELECT stor_id, dbo.fn_median(stor_id) AS median
FROM dbo.stores;
GO

-- Решение на SQL Server 2005
WITH salesRN AS
(
  SELECT stor_id, qty,
    ROW_NUMBER() OVER(PARTITION BY stor_id ORDER BY qty) AS rownum,
    COUNT(*) OVER(PARTITION BY stor_id) AS cnt
  FROM sales
)
SELECT stor_id, CAST(AVG(1.*qty) AS NUMERIC(11, 1)) AS median
FROM salesRN
WHERE rownum IN ((cnt+1)/2, (cnt+2)/2)
GROUP BY stor_id;
GO

Этот пример для вычисления медианы также демонстрирует упрощение кода при использовании предложения OVER.

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

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

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

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

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

Контакты

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

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

В избранное