| ← Ноябрь 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. Вы также можете предложить свои задачи для публикации на сайте. |
| В избранное | ||
