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

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


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

Выпуск 513 от 26 июля 2014 г.

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

SQL Exercises

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

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

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

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


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

§ Самые популярные темы недели на форуме

Топик		Сообщений
212 (SELECT)	26
213 (SELECT)	21
1 (Learn)		3
54 (Learn)	3
49 (Learn)	2

 

§ Авторы недели на форуме

Автор		Число сообщений
qwrqwr  	21
Baser  		9
pegoopik  	5
Arcan  		5
GriGrim  		3

 

§ Объявленные конкурсы по оптимизации запросов

Задача	Дата		Автор
147	2012-02-23	$erges
159	2012-07-25	anddros
170	2011-07-15	qwrqwr
182	2012-02-16	Baser
192	2012-03-03	Baser
259	2012-07-23	anddros

 

Дополнительные неоптимизационные конкурсы

Задача	Дата		Автор/Организатор конкурса
71	2010-12-26	anddros (завершен)
88	2012-07-12	crescent/Pegoopik  (завершен)
91	2012-05-31	smog/$erges
121	2012-07-06	ZrenBy/anddros
153	2010-09-21	Ozzy

 

§ Изменения среди лидеров (решенные за неделю задачи третьего этапа):
12. smog (165)
27. GriGrim (193, 202, 207)

§ Продвижение ближайших претендентов на попадание в ТОР 100 (число задач, время решения в днях):
115. Gaizenberg (137, 106.018)
181. demkse (112, 362.792)
195. Dracul4ik (109, 369.363)
198. vasilyvanc (113, 20.058)
205. katyuha (105, 43.791)
214. Kazaam (106, 30.826)
217. Iura__ (104, 11.185)

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

Число упражнений:
   на обучающем этапе - 120;
   на рейтинговых этапах - 211;
   DML - 24
   головоломки - 14 (отрицательные номера) + 10 (3 этап).

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

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

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

На обучающем этапе - 115187

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1Филиппкин Д.В. (_dimon_)1239212245612009183.589117.6091922014-07-222014-07-25
2Креславский О.М. (Arcan)1239213245612725232.821177.1091922014-07-192014-07-25
3Бежаев А.Ю. (Baser)1238212245591539162.424140.2751922014-07-192014-07-25
4Курочкин П.А. (qwrqwr)1238212245591711228.319155.0701902014-07-182014-07-25
5Boiko D. (Angellore)1236-142455725133276.1521686.0741882014-06-282014-07-06
6Карасёва Н.В. (vlksm)123593245552883230.729182.8941882014-04-052014-07-19
7Сальников С.А. ($erges)1211-1124506205914.79811.9891532013-10-162014-07-24
8Яцук А.А. (Faust_zp)1196255244791985144.249108.8401372012-07-122012-07-30
9Кузнецов В.С. (herrRo)1181260234381170481.35473.3351222012-02-082013-06-18
10Дроздков А.Н. (anddros)520221324460224412.54011.1021092014-07-212014-07-25
11Дубинский А.В. (_velial)11971352446316521879.5502429.0111082014-05-232014-06-07
12Кукушкин С.А. (smog)12205165244561200903.0211021.8831082014-07-232014-07-24
13Шиндин А.В. (AlShin)115725223392928408.676777.457992011-05-052014-05-18
14Тарасов Д.Б. (Gavrila)917432234142428151.42499.710952012-04-232012-05-25
15Орлов М.В. (Eagleoff)9161-323392952138.529106.466922011-11-102014-07-24
16Гринкевич Д.Л. (Дмитрий Гринкевич)161929324418950130.004260.462832014-05-182014-07-25
17Зотов П.Г. (Ozzy)115913233871412213.869187.364832012-02-052014-05-20
18Держальцев В.А. (MadVet)3147100223642073143.50499.698812010-12-292011-09-26
19Красовский Е.А. (pegoopik)18197213244471475204.2117.551782014-07-222014-07-25
20Агапов В. (KERBEROS)117125324404240935.64027.703692013-04-022014-01-30

TOP 10 по оптимизации запросов


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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1yakovlev V. (wyt)2323353772118125 Jul 2014
2Shirokova K. (Christoferchik)1112223344824 Jul 2014
3Макас (tensa_zangetsy)2541620316225 Jul 2014
4>Шахбулатов Р.Г. (ruslan-shah)13511801874025 Jul 2014
5Sigankov V.I. (vasilyvanc)101131701719825 Jul 2014
6>Лебедь Д.А. (Get it)141417017397025 Jul 2014
7>Shchukin V.B. (VladBorisovich)93415015104925 Jul 2014
8VK (Prima_Vera)0
01515417621 Jul 2014
9Мостовой А.А. (Андрей)93014014134124 Jul 2014
10Малышев А. (Alexey_m)0
01313443925 Jul 2014
11Берестнева Н.А. (Wolfna)5781201248624 Jul 2014
12Мараев С.Д. (Bazovskii)0
01212459620 Jul 2014
13>Иоффе Ю.А. (Iura__)41041101121725 Jul 2014
14>Степанов (JanosAudron)5951101124225 Jul 2014
15Тюрин В.В. (shinom)7531101171823 Jul 2014
16Иванов H.В. (Hockney)8911011452825 Jul 2014
17>Колбасов П.А. (kolbasOff)5791001039825 Jul 2014
18Иванова (Devilmouse)6641001088124 Jul 2014
19Sindhoor (Sindhoor)49754924525 Jul 2014
20>Даулетбеков Д.Б. (Danikkk)49390940925 Jul 2014

Изучаем SQL

Пример использования DENSE_RANK

Моисеенко С.И.

Часто встречается задача нахождения N-го по величине значения из набора значений некоторого столбца таблицы, например:

Найти второе по величине значение цены в таблице PC.

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

    SELECT  price, DENSE_RANK() OVER(ORDER BY price DESC) dense_rnk,
    RANK() OVER(ORDER BY price DESC) rnk,
    ROW_NUMBER() OVER(ORDER BY price DESC) rn
    FROM PC ORDER BY price DESC;

price   dense_rnk  	rnk    	rn
980,00    	1   	1      1
970,00    	2   	2      2
950,00    	3   	3      3
850,00    	4   	4      4
850,00    	4   	4      5
850,00    	4   	4      6
600,00    	5   	7      7
600,00    	5   	7      8
400,00    	6   	9      9
350,00    	7   	10     10
350,00    	7   	10     11
350,00    	7   	10     12

В рамках стандарта SQL-92 эту задачу можно решить следующим образом:

    SELECT MAX(price) "2nd_price"  FROM PC
    WHERE price < (SELECT MAX(price) FROM PC);

2nd_price
970,00

Т.е. мы находим значение максимума среди всех значений, меньших максимального. А если нам потребуется найти значение третьей по величине цены? Можно поступить аналогично:

    SELECT MAX(price) "3rd_price" FROM PC WHERE price <
    (
    SELECT MAX(price) FROM PC
    WHERE price < (SELECT MAX(price) FROM PC)
    );

3rd_price
950,00

А как найти N-е значение цены? Следуя используемой логике, мы можем добавлять новые "матрешки" к уже существующим вплоть до N-ой. Это решение никак не назовешь универсальным.

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

    SELECT DISTINCT price FROM(
    SELECT DENSE_RANK() OVER(ORDER BY price DESC) rnk, price FROM PC
    ) X WHERE rnk=2;

А чтобы найти любую другую порядковую цену (например, третью), достаточно поменять константу в условиях отбора:

    SELECT DISTINCT price FROM(
    SELECT DENSE_RANK() OVER(ORDER BY price DESC) rnk, price FROM PC
    ) X WHERE rnk=3;

Следует отметить, что использование DENSE_RANK, а не RANK, обусловлено тем, что в случае наличия одинаковых цен, значения, возвращаемые функцией RANK, будут иметь пропуски (рассмотрите задачу нахождения пятой по величине цены). Если же ставить задачу нахождения неуникального N-го значения, то можно использовать функцию ROW_NUMBER (например, третий человек в шеренге по росту). А если значения в таблице уникальны, то решение с помощью любой из этих функций даст один и тот же результат.

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

§ Вы можете купить футболку или кружку с логотипом сайта.

§ В настоящее время для решения упражнений на сайте используются следующие СУБД: SQL Server 2012 Express, Oracle 11g Express Edition, MySQL 5, PostgreSQL 9.

§ Группа SQL Exercises на LinkedIn.com. Присоединяйтесь!

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

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

§ Книги и статьи по SQL.

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

Контакты

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

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

В избранное