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

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


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

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

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

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

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

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


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

§ Наш сайт вышел в третий этап народного голосования (в ТОР 100) в рамках Премии Рунета. Это явный прогресс - пока 44 место по сравнению с 177 местом в прошлом году. Спасибо всем проголосовавшим. Однако голосование еще продолжается :-).

§ Сколько решений, столько и ошибок :-). Пока все принятые системой решения 143 задачи были не вполне верные. Общими усилиями формируется проверочная база; прошло ее очередное обновление.

§ Последнюю задачу третьего этапа решила Katy_Ekb и вышла на первое место в рейтинге (время на третьем этапе 4.673).
Первую задачу третьего этапа - 139 - решил Faust_zp. Этого уже недостаточно, чтобы попасть в ТОР 20 :-).

§ Новые лица в сотне или вернулись в нее:
Demonius (121, 98.981)

§ Продвинулись в рейтинге:
Kamin (133, 57.446)
Heromantor (131, 9.009)
Kos123 (125, 26.673)
AlexFJ (121, 83.111)

§ На этой неделе сертифицированы:
Kos123 (B07005751) [AR] - г.Красноярск, Россия

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

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

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

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

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

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Белогурова К. (Katy_Ekb) 143 143 21 346 155 9.563 4.673 18 27 Oct 2007 31 Oct 2007
2 Креславский О.М. (Arcan) 143 143 21 346 269 17.514 7.720 18 26 Oct 2007 02 Nov 2007
3 Карасёва Н.В. (vlksm) 143 143 21 346 529 38.118 12.414 18 17 Oct 2007 02 Nov 2007
4 Голубин Р.С. (Roman S. Golubin) 143 143 21 346 795 69.101 43.885 18 22 Oct 2007 02 Nov 2007
5 Северюхин Ю.А. (Venser) 142 142 21 342 200 4.950 .655 14 19 Sep 2007 30 Oct 2007
6 Тарасов Д.Б. (Gavrila) 142 142 21 342 755 23.423 2.501 14 20 Sep 2007 02 Nov 2007
7 Солдатенков Ю.С. (SolYUtor) 142 142 21 342 490 17.853 2.695 14 20 Sep 2007 30 Oct 2007
8 Шептунов П.П. (Dzen) 142 142 21 342 279 8.186 3.499 14 02 Oct 2007 16 Oct 2007
9 Мурашкин И.В. (lepton) 142 142 21 342 544 15.800 5.539 14 18 Sep 2007 01 Nov 2007
10 Мальцев А.В. (Палкин) 142 142 21 342 422 49.738 7.690 14 13 Oct 2007 26 Oct 2007
11 Бураков С.Г. (burakov58) 142 142 21 342 974 51.702 19.814 14 30 Sep 2007 01 Nov 2007
12 Агапов В. (KERBEROS) 135 141 20 326 89 6.143 1.262 11 20 Nov 2006 27 Jul 2007
13 Кувалкин К.С. (Cyrilus) 139 141 20 334 1014 12.506 2.519 11 04 Sep 2007 02 Nov 2007
14 Зверев Д.Л. (dimzv) 135 141 20 326 1141 9.278 4.938 11 19 Dec 2006 22 Dec 2006
15 Войнов П.Е. (pаparome) 141 142 21 338 765 2.788 .049 10 28 Sep 2007 22 Oct 2007
16 Любченко В.А. (IAS56) 141 142 21 338 377 177.859 20.130 10 16 Sep 2007 02 Nov 2007
17 Васьков Е.В. (Johan) 138 140 21 332 402 12.733 11.402 7 25 Aug 2007 25 Aug 2007
18 Радар Ю.В. (inkerman) 139 143 21 332 60 5.354 .000 4 07 Oct 2007 02 Nov 2007
19 Валуев Д.И. (Fiolent) 139 140 21 332 1511 118.144 62.302 4 24 Oct 2007 02 Nov 2007
20 Юлдашев М.Р. (Snowbear) 139 139 21 331 791 4.162 .000 3 17 Sep 2007 30 Oct 2007

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

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Bobyr E.V. (LM) 50 50 95 19 114 1074 02 Nov 2007
2 >Городилов А.Ю. (GorA3000) 56 56 107 0 107 1180 02 Nov 2007
3 >Benjamin (BenVaflek) 41 41 71 23 94 1536 02 Nov 2007
4 >Шуняев Д. (cgs) 41 41 79 0 79 1966 02 Nov 2007
5 Sodi (Xadash) 31 56 67 9 76 1037 02 Nov 2007
6 Dima D.D. (dimadimkind) 36 42 72 1 73 1970 01 Nov 2007
7 >Kazantsev K.V. (s@nctus) 38 38 69 1 70 2347 02 Nov 2007
8 >Быков И. (SPATHI) 21 59 40 25 65 597 02 Nov 2007
9 >Bechutskiy D.B. (sty) 37 37 62 3 65 2611 02 Nov 2007
10 >Головишников К.В. (ImKot) 27 41 61 0 61 2052 02 Nov 2007
11 Верховский (РомаВ) 33 33 60 0 60 2883 01 Nov 2007
12 >Shlyakhetko S. (GreyIII) 32 32 60 0 60 2889 02 Nov 2007
13 >Арыкина А. (Clair) 33 33 59 0 59 2972 02 Nov 2007
14 >Печатнов В.В. (pvv) 26 97 57 0 57 180 02 Nov 2007
15 >Кучерова А. (Nastyaru) 28 57 55 0 55 1140 02 Nov 2007
16 Федяков С. (Uncle Fedor) 19 32 46 9 55 2407 01 Nov 2007
17 >Кожиев Б.М. (Borik) 31 31 52 3 55 3256 02 Nov 2007
18 Овсянникова (trurl) 14 27 34 19 53 2534 02 Nov 2007
19 >Воронков (Shadow of Cat) 29 29 53 0 53 3483 02 Nov 2007
20 Магсумов М.З. (Маратik) 10 57 21 29 50 685 02 Nov 2007
21 >Мережников А.Б. (Scorpion) 8 59 16 33 49 603 02 Nov 2007
22 >Grom P. (Thunder) 20 33 48 0 48 2781 01 Nov 2007
23 Гананчян А.В. (Gav_1) 16 29 39 9 48 2783 02 Nov 2007
24 Duginov (Vonnegut) 28 28 48 0 48 3864 02 Nov 2007
25 Собиров Ф.М. (Fax) 16 29 39 3 42 3125 02 Nov 2007
26 Миронов А.Ю. (El) 19 33 41 0 41 3113 01 Nov 2007
27 Лена П. (franny&zooey) 19 27 40 0 40 3895 01 Nov 2007
28 >Meka M. (Hita) 21 21 32 8 40 4436 02 Nov 2007

Изучаем 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.

§ В рамках Премии Рунета проводится "народное голосование". Если вы считаете, что наш сайт заслуживает большей известности в рунете, проголосуйте за него. Для этого
- Пройдите по ссылке www.premiaruneta.ru/narod/vote/.
- Поставьте флажок напротив sql-ex.ru (ближе к концу списка).
- Поставьте флажок "Я согласен с правилами..." ниже списка участников.
- Нажмите кнопку Проголосовать!
Вы можете проголосовать сразу за нескольких участников.

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

Контакты

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

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

В избранное