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

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


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

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

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

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

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

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


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

§ Как объединить данные из двух столбцов в один без использования UNION и JOIN?
Такие вопросы с завидной регулярностью появляются на страницах различных форумов. К слову сказать, для меня до сих пор остается загадкой, почему при этом ставится дополнительное условие не использовать UNION и/или JOIN. Могу лишь предположить, что это вопросы, которые задают на собеседовании при приеме на работу.
Известные мне способы я решил изложить в виде дополнения к справке на сайте (www.sql-ex.ru/help/select14.php) в надежде, что этот раздел будет периодически пополняться материалами, выходящими за рамки упражнений.

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
23. Ozzy (141, 142)
34. rage (139) - второй результат по итогам второго этапа
36. mz (142)

§ Завершили второй этап:
38. anddros (задач 138, время 3.143) - четвертый результат по итогам второго этапа.

§ Новые лица в ТОР 100 и вернувшиеся туда:
59. yoj (133, 9.724)

§ Продвинулись в рейтинге:
48. Fomichev (136, 17.505)
50. marishkin (134, 67.920)
53. Umrikhina (135, 4.386)
56. nebiros (135, 149.668)
63. Eka (132, 13.643)
74. shadon (129, 24.424)

§ Продвижение ближайших претендентов на попадание в ТОР 100:
115. -=ac=- (120, 61.160)
132. D-m-i-t-r-y (120, 36.649)
175. Mikha (110, 9.147)

§ На этой неделе сертифицированы:
Olaf (A08011002) [BK] - г.Красноярск, Россия
Ashton (A08030894) [BK] - г.Москва, Россия
rage (B08036198) [AR]) - г.Минск, Беларусь

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

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

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

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

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

Лучшие результаты (ТОР 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 22 Aug 2008
2 Креславский О.М. (Arcan) 147 147 21 357 517 37.671 27.498 31 30 Jun 2008 22 Aug 2008
3 Карасёва Н.В. (vlksm) 147 147 21 357 778 73.340 46.383 31 22 Jun 2008 22 Aug 2008
4 Печатнов В.В. (pvv) 146 146 21 354 257 19.426 6.326 28 02 Jul 2008 22 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 16 Aug 2008
7 Голубин Р.С. (Roman S. Golubin) 144 145 21 348 1044 92.981 58.822 25 27 Jun 2008 21 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 22 Aug 2008
11 Селезнёв А.С. (Артём С.) 144 146 21 346 281 18.546 6.728 20 15 Aug 2008 22 Aug 2008
12 Белогурова К. (Katy_Ekb) 138 143 21 335 361 10.714 4.673 18 20 May 2008 31 Jul 2008
13 Егоров А.Б. (ABEgorov) 143 144 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 20 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 22 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 >Yakimansky V. (axfreelancer) 59 59 109 34 143 796 22 Aug 2008
2 E (EYuri) 53 53 100 32 132 930 19 Aug 2008
3 >Shlykov (BruN) 33 40 68 15 83 1961 22 Aug 2008
4 Панов Р.Р. (Ratmir) 27 62 48 34 82 762 19 Aug 2008
5 >Ряховский С.В. (fix4fix) 38 38 70 3 73 2717 22 Aug 2008
6 Лукьянов А.С. (Johnny B. Goode) 39 39 72 0 72 2771 20 Aug 2008
7 >Kov А.С. (Alen-ka) 38 38 71 0 71 2832 22 Aug 2008
8 >Corneliu S. (Lush) 28 28 53 17 70 2886 22 Aug 2008
9 >Грошев А.В. (Heymexa) 30 38 61 6 67 2467 22 Aug 2008
10 >Nemova Y. (Tushkanchik) 29 47 66 0 66 1963 22 Aug 2008
11 Толчанов В.Б. (Minnaloushe) 29 29 53 9 62 3407 18 Aug 2008
12 Чубенко А.В. (alexteam) 16 26 35 17 52 3347 22 Aug 2008
13 abakumov (Olejka) 24 28 47 4 51 3986 21 Aug 2008
14 >spanache A.M. (sanamaria2001) 18 21 31 17 48 4363 22 Aug 2008
15 >Zhamkov (Oll123) 25 25 48 0 48 4685 22 Aug 2008
16 >Толстихин К.В. (magi) 23 23 39 9 48 4697 21 Aug 2008
17 Серёгин А. (Сан Саныч) 7 52 16 31 47 933 22 Aug 2008
18 Назарова Е.В. (jb1986) 24 24 44 1 45 5009 22 Aug 2008
19 Ярмарков А.О. (Yarmarkov) 25 25 45 0 45 5021 21 Aug 2008
20 >Mister_X (Mister X) 25 25 42 0 42 5390 22 Aug 2008
21 Шкаренков М.С. (Sw@sud) 15 40 39 2 41 2520 22 Aug 2008
22 >Кулаков А. (Bumerang) 20 29 41 0 41 4373 22 Aug 2008
23 Samokhina A. (TmpFile()) 12 58 23 17 40 813 21 Aug 2008
24 Валеев (mLex) 22 22 40 0 40 5606 21 Aug 2008
25 >Шандаров А. (Shandarov) 24 24 40 0 40 5614 22 Aug 2008

Изучаем SQL

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

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

Функции ранжирования в SQL Server 2005 SQL могут применяться как с конструкцией PARTITION BY, так и с дополнительным предложением ORDER BY. Следующий запрос показывает пример использования предложения OVER для всех ранжирующих функций с предложениями PARTITION BY и ORDER BY. Для каждого разбиения partition ранжирующая функция вычисляется отдельно.

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

SELECT orderid, empid, qty,
  ROW_NUMBER() OVER(PARTITION BY empid ORDER BY qty) AS rownum,
  RANK()       OVER(PARTITION BY empid ORDER BY qty) AS rnk,
  DENSE_RANK() OVER(PARTITION BY empid ORDER BY qty) AS densernk,
  NTILE(4)     OVER(PARTITION BY empid ORDER BY qty) AS ntile4
FROM dbo.Orders
ORDER BY empid, qty;
-------------------------------------------------------------------------------
Orderid empid   qty rownum    rnk densernk    ntile4
10001 1 10 1 1 1 1
10006 1 10 2 1 1 2
10005 1 30 3 3 2 3
20001 2 20 1 1 1 1
20002 2 20 2 1 1 2
30001 3 10 1 1 1 1
30003 3 15 2 2 2 2
30004 3 20 3 3 3 3
30007 3 30 4 4 4 4
40005 4 10 1 1 1 1
40001 4 40 2 2 2 2

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

Из результатов запроса, представленных в таблице 3-4, мы можем увидеть, что все функции работают так же, как в ранее приведенном примере, за исключением того, что они применяются к разбиению, определяемому empid - столбцом, указанным в конструкции PARTITION BY.

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

Если мы вернемся к результатам в таблице 3-3, то увидим, что для всех записей с qty = 10 (orderid 30001, 10001?10006 и 40005) номера строк принимают значения от 1 до 4. Однако результат был бы правильным, если бы эти номера от 1 до 4 были присвоены этим четырем строкам в любом другом порядке. Это делает запрос недетерминированным. Функции ROW_NUMBER и NTILE детерминированы только тогда, когда значения из списка упорядочения (ORDER BY) уникальны. Если значения в колонках из ORDER BY не уникальны, то обе функции недетерменированы. Продемонстрируем это следующим запросом.

-------------------------------------------------------------------------------
-- Детерменизм - ROW_NUMBER, NTILE
-------------------------------------------------------------------------------
SELECT orderid, qty,
  ROW_NUMBER() OVER(ORDER BY qty)          AS nd_rownum,
  ROW_NUMBER() OVER(ORDER BY qty, orderid) AS d_rownum,
  NTILE(4)     OVER(ORDER BY qty)          AS nd_ntile4,
  NTILE(4)     OVER(ORDER BY qty, orderid) AS d_ntile4
FROM dbo.Orders
ORDER BY qty, orderid;

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

orderid qty nd_rownum d_rownum nd_ntile4 d_ntile4
10001 10 2 1 1 1
10006 10 3 2 1 1
30001 10 1 3 1 1
40005 10 4 4 2 2
30003 15 5 5 2 2
20001 20 8 6 3 2
20002 20 7 7 3 3
30004 20 6 8 2 3
10005 30 9 9 3 3
30007 30 10 10 4 4
40001 40 11 11 4 4

Таблица 3-5. Детерминизм функций ROW_NUMBER, NTILE

Из результатов в таблице 3-5 мы можем увидеть, что когда мы добавляем orderid в список для ORDER BY и делаем значения в столбцах уникальными, мы получаем гарантированные детерминированные значения номера строк. С другой стороны, функции RANK и DENSE_RANK детерминированы, потому что они задают одинаковые ранговые значения для одинаковых значений в столбце сортировки. Продемонстрируем это следющим примером.

---------------------------------------------------------------------
-- Детерменизм - RANK, DENSE_RANK
---------------------------------------------------------------------

SELECT orderid, qty,
  RANK()       OVER(ORDER BY qty) AS d_rnk,
  DENSE_RANK() OVER(ORDER BY qty) AS d_dnsrnk
FROM dbo.Orders
ORDER BY qty, orderid;
GO


orderid qty d_rnk d_dnsrnk
10001 10 1 1
10006 10 1 1
30001 10 1 1
40005 10 1 1
30003 15 5 2
20001 20 6 3
20002 20 6 3
30004 20 6 3
10005 30 9 4
30007 30 9 4
40001 40 11 5

Таблица 3-6. Детерминизм функций RANK, DENSE_RANK

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

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

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

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

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

Контакты

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

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

В избранное