← Ноябрь 2007 → | ||||||
1
|
2
|
4
|
||||
---|---|---|---|---|---|---|
5
|
6
|
7
|
8
|
9
|
11
|
|
12
|
13
|
14
|
15
|
16
|
18
|
|
19
|
20
|
21
|
22
|
23
|
25
|
|
26
|
27
|
28
|
29
|
30
|
За последние 60 дней ни разу не выходила
Сайт рассылки:
http://www.sql-ex.ru
Открыта:
15-09-2004
Статистика
0 за неделю
Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru) 162
Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 162 (2 ноября 2007 г.)Новым посетителям сайтаСайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 57-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений. Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе, который начинается после 138 задачи.Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий. Новости сайта§ Наш сайт вышел в третий этап народного голосования (в ТОР 100) в рамках Премии Рунета. Это явный прогресс - пока 44 место по сравнению с 177 местом в прошлом году. Спасибо всем проголосовавшим. Однако голосование еще продолжается :-). § Сколько решений, столько и ошибок :-). Пока все принятые системой решения 143 задачи были не вполне верные. Общими усилиями формируется проверочная база; прошло ее очередное обновление. § Последнюю задачу третьего этапа решила Katy_Ekb и вышла на первое место в рейтинге (время на третьем этапе 4.673). § Новые лица в сотне или вернулись в нее: § Продвинулись в рейтинге: § На этой неделе сертифицированы: § Число подписчиков - 3656 Число участников рейтинга - 12142 Число участников второго этапа - 1113 Сертифицировано на сайте - 192 Лучшие результаты (ТОР 20)
Лучшие результаты за неделю
Изучаем SQLКоличественное определение различий текста на T-SQL (окончание, начало в вып.161)William Brewer (оригинал: Quantifying Text differences in T-SQL )Перевод Моисеенко С.И.
IF OBJECT_ID(N'dbo.uftWordTokens') IS NOT NULL DROP FUNCTION dbo.uftWordTokens GO /*------------------------------------------------------------*/ CREATE FUNCTION [dbo].[uftWordTokens] ( @string NTEXT, @WordStartCharacters VARCHAR(255) = 'a-z', @WordCharacters VARCHAR(255) = '-a-z''' ) RETURNS @Results TABLE ( SeqNo INT IDENTITY(1, 1), Item VARCHAR(255), TokenType INT ) AS /* Эта табличная функция создает таблицу, которая разделяет слова и пробелы между словами в некотором тексте и создает таблицу двух типов, взятых в последовательности, в которой они обнаруживаются */ BEGIN DECLARE @Pos INT, --индекс текущего поиска @WhereWeAre INT,--текущий индекс в строке @ii INT, --текущее число найденных слов @next INT, --откуда стартует поиск @size INT --полный размер текста SELECT @ii = 0, @WhereWeAre = 1, @size = DATALENGTH(@string) WHILE @Size >= @WhereWeAre BEGIN SELECT @pos = PATINDEX('%[' + @wordStartCharacters + ']%', SUBSTRING(@string, @whereWeAre, 4000)) IF @pos > 0 BEGIN IF @pos > 1 INSERT INTO @Results ( item, tokentype ) SELECT SUBSTRING(@String, @whereWeAre, @pos - 1), 2 SELECT @next = @WhereWeAre + @pos, @ii = @ii + 1 SELECT @pos = PATINDEX('%[^' + @wordCharacters + ']%', SUBSTRING(@string, @next, 4000) + ' ') INSERT INTO @Results ( item, tokentype ) SELECT SUBSTRING(@String, @next - 1, @pos), 1 SELECT @WhereWeAre = @next + @pos - 1 END ELSE BEGIN IF LEN(REPLACE( SUBSTRING(@String, @whereWeAre, 4000), ' ', '!' )) > 0 INSERT INTO @Results ( item, tokentype ) SELECT SUBSTRING(@String, @whereWeAre, 4000), 2 SELECT @whereWeAre = @WhereWeAre + 4000 END END RETURN END /* Тесты: SELECT '[' + item + ']', tokentype FROM dbo.uftWordTokens('This has been relentlessly ,^----tested', DEFAULT, DEFAULT) SELECT '[' + item + ']', tokentype FROM dbo.uftWordTokens('This has been relentlessly tested !', DEFAULT, DEFAULT) SELECT item, tokentype FROM dbo.uftWordTokens('This has been', DEFAULT, DEFAULT) SELECT '[' + item + ']', tokentype FROM dbo.uftWordTokens(' ', DEFAULT, DEFAULT) */ GO IF OBJECT_ID(N'dbo.ufnDifferencesInText') IS NOT NULL DROP FUNCTION dbo.ufiDifferencesInText GO /*------------------------------------------------------------*/ CREATE FUNCTION dbo.ufiDifferencesInText ( @Sample NTEXT, @comparison NTEXT ) RETURNS INT AS BEGIN DECLARE @results TABLE ( token_ID INT IDENTITY(1, 1), sequenceNumber INT, Sample_ID INT, Item VARCHAR(255), TokenType INT ) /* Эта функция возвращает число отличий, обнаруженное в двух текстах */ INSERT INTO @results ( SequenceNumber, Sample_ID, Item, Tokentype ) SELECT seqno, 1, item, tokentype FROM dbo.uftWordTokens(@sample, DEFAULT, DEFAULT) INSERT INTO @results ( SequenceNumber, Sample_ID, Item, Tokentype ) SELECT seqno, 2, item, tokentype FROM dbo.uftWordTokens(@comparison, DEFAULT, DEFAULT) DECLARE @closestMatch TABLE ( sequenceNumber INT, skew INT ) INSERT INTO @closestMatch ( sequencenumber, skew ) SELECT COALESCE(a.sequencenumber, b.sequencenumber), COALESCEE(MIN(ABS(COALESCE(b.sequenceNumber, 1000) - COALESCE(a.sequencenumber, 1000))), -1) FROM ( SELECT * FROM @results WHERE sample_ID = 1 AND tokentype = 1 ) a FULL OUTER JOIN ( SELECT * FROM @results WHERE sample_ID = 2 AND tokentype = 1 ) b ON a.item = b.item GROUP BY COALESCE(a.sequencenumber, b.sequencenumber) ORDER BY COALESCE(a.sequencenumber, b.sequencenumber) RETURN ( SELECT SUM(CASE WHEN a.skew - b.skew = 0 THEN 0 ELSE 1 END) FROM @closestmatch a INNER JOIN @closestMatch b ON b.sequenceNumber = a.sequenceNumber + 2 ) END GO SELECT dbo.ufnDifferencesInText('I am a piece of text', 'I am a piece of text') --0 SELECT dbo.ufnDifferencesInText('I am a piece of text', 'I am not a piece of text') --1 SELECT dbo.ufnDifferencesInText('I am a piece of text', 'I am piece a a a of text') --2 SELECT dbo.ufnDifferencesInText('I piece of text', 'I am a piece of text') --1 SELECT dbo.ufnDifferencesInText('I am a pot of jam', 'I am a piece of text') --3 SELECT dbo.ufnDifferencesInText('I am a pot of jam', 'I am a pot of jam beloved by humans') --3 SELECT dbo.ufnDifferencesInText('I am a piece of text', 'text of piece a am I') --4 SELECT dbo.ufnDifferencesInText('I am a piece of text', 'this is completely different') --5 SELECT dbo.ufnDifferencesInText('I am a piece of text', '') --5 SELECT dbo.ufnDifferencesInText('', 'I am a piece of text') --5 SELECT dbo.ufnDifferencesInText('Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen, and regulating the circulation. Whenever I find myself growing grim about the mouth; whenever it is a damp, drizzly November in my soul; whenever I find myself involuntarily pausing before coffin warehouses, and bringing up the rear of every funeral I meet; and especially whenever my hypos get such an upper hand of me, that it requires a strong moral principle to prevent me from deliberately stepping into the street, and methodically knocking people''s hats off -- then, I account it high time to get to sea as soon as I can. This is my substitute for pistol and ball. With a philosophical flourish Cato throws himself upon his sword; I quietly take to the ship. There is nothing surprising in this. If they but knew it, almost all men in their degree, some time or other, cherish very nearly the same feelings towards the ocean with me.' , 'Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen, and regulating the circulation. Whenever I find myself growing grim about the mouth; whenever it is a damp, drizzly November in my soul; whenever I find myself involuntarily pausing before coffin warehouses, and bringing up the rear of every funeral I meet; and especially whenever my hypos get such an upper hand of me, that it requires a strong moral principle to prevent me from deliberately stepping into the street, and methodically knocking people''s hats off -- then, I account it high time to get to sea as soon as I can. This is my substitute for pistol and ball. With a philosophical flourish Cato throws himself upon his sword; I quietly take to the ship. There is nothing surprising in this. If they but knew it, almost all men in their degree, some time or other, cherish very nearly the same feelings towards the ocean with me.') -- ============================================= -- Описание: Процедура, которая возвращает единственную строку, -- которая дает контекст первого различия двух строк -- ============================================= IF OBJECT_ID(N'dbo.uftShowFirstDifference') IS NOT NULL DROP FUNCTION dbo.uftShowFirstDifference GO CREATE FUNCTION uftShowFirstDifference ( -- Добавляем параметры для этой функции @sample NTEXT, @comparison NTEXT ) RETURNS @result TABLE ( -- Добавляем определения столбцов для табличной переменной first VARCHAR(2000), second VARCHAR(2000), [where] INT ) AS BEGIN DECLARE @results TABLE ( token_ID INT IDENTITY(1, 1), sequenceNumber INT, Sample_ID INT, Item VARCHAR(255), TokenType INT ) INSERT INTO @results ( SequenceNumber, Sample_ID, Item, Tokentype ) SELECT seqno, 1, item, tokentype FROM dbo.uftWordTokens(@sample, DEFAULT, DEFAULT) INSERT INTO @results ( SequenceNumber, Sample_ID, Item, Tokentype ) SELECT seqno, 2, item, tokentype FROM dbo.uftWordTokens(@comparison, DEFAULT, DEFAULT) DECLARE @closestMatch TABLE ( sequenceNumber INT, skew INT ) INSERT INTO @closestMatch ( sequencenumber, skew ) SELECT COALESCE(a.sequencenumber, b.sequencenumber), COALESCE(MIN(ABS(COALESCE(b.sequenceNumber, 1000) - COALESCE(a.sequencenumber, 1000))), -1) FROM ( SELECT * FROM @results WHERE sample_ID = 1 AND tokentype = 1 ) a FULL OUTER JOIN ( SELECT * FROM @results WHERE sample_ID = 2 AND tokentype = 1 ) b ON a.item = b.item GROUP BY COALESCE(a.sequencenumber, b.sequencenumber) ORDER BY COALESCE(a.sequencenumber, b.sequencenumber) DECLARE @first VARCHAR(2000) DECLARE @firstDifference INT DECLARE @second VARCHAR(2000) SELECT @FirstDifference = MIN(sequenceNumber) FROM @closestMatch WHERE skew <> 0 SELECT @first = '', @second = '' SELECT TOP 10 @first = COALESCE(@First, '') + item FROM @results WHERE sample_ID = 1 AND sequenceNumber >= @FirstDifference ORDER BY SequenceNumber SELECT TOP 10 @second = COALESCE(@second, '') + item FROM @results WHERE sample_ID = 2 AND sequenceNumber >= @FirstDifference ORDER BY SequenceNumber INSERT INTO @result ( first, Second, [where] ) SELECT [first] = @First, [second] = @second, [where] = @FirstDifference RETURN END GO SELECT * FROM dbo.uftShowFirstDifference('I am a piece of text', 'I am a piece of text') -- NULL SELECT * FROM dbo.uftShowFirstDifference('I am a piece of text', 'I am not a piece of text') --a piece of text not a piece of text 5 SELECT * FROM dbo.uftShowFirstDifference('I am a piece of text', 'I am piece a a a of text') --a piece of text piece a a a of 5 SELECT * FROM dbo.uftShowFirstDifference('I piece of text', 'I am a piece of text') --piece of text am a piece of text 3 SELECT * FROM dbo.uftShowFirstDifference('I am a pot of jam', 'I am a piece of text') --pot of jam piece of text 7 SELECT * FROM dbo.uftShowFirstDifference('I am a pot of jam', 'I am a pot of jam beloved by humans') -- beloved by humans 13 SELECT * FROM dbo.uftShowFirstDifference('I am a piece of text', 'text of piece a am I') --I am a piece of text of piece a am 1 SELECT * FROM dbo.uftShowFirstDifference('I am a piece of text', 'this is completely different') --I am a piece of this is completely different 1 SELECT * FROM dbo.uftShowFirstDifference('I am a piece of text', '') --I am a piece of 1 SELECT * FROM dbo.uftShowFirstDifference('', 'I am a piece of text') -- I am a piece of 1
20-09-2007 Полезная информация§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL. § В рамках Премии Рунета проводится "народное голосование". Если вы считаете, что наш сайт заслуживает большей известности в рунете, проголосуйте за него. Для этого § Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях: КонтактыПо всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте. |
В избранное | ||