Выбор "любого" GUID из группировки (TSQL)
От: diamondio  
Дата: 07.08.07 09:12
Оценка:
Здравствуйте!

Не первый раз сталкиваюсь со следующей проблемой.

В MSSQL БД имеется таблица из 2 полей:
id uniquieidentifier PK,
attrib varchar(100)

Надо сделать запрос:
На входе у него список строк,
На выходе должно быть не более чем по одному id на каждую входную строку (по полю attrib).
Проблема в том, что attrib не является уникальным полем.
В случае, если attrib встречается в нескольких записях, можно выбрать любую.

Очевидное решение выглядит так:
select max(id)
from table1
where attrib in (<list>)
group by attrib

Проблема в том, что агрегаты не принимают uniqueidentifier.

Может быть, есть какой-нибудь способ? Кроме
Convert(uniqueidentifier, max(convert(varchar, id)))


Заранее благодарен ответам!

С уважением,
Дмитрий Позняк.
Re: Выбор "любого" GUID из группировки (TSQL)
От: DuШes  
Дата: 07.08.07 09:26
Оценка:
Здравствуйте, diamondio, Вы писали:

D>Здравствуйте!


D>Не первый раз сталкиваюсь со следующей проблемой.


D>В MSSQL БД имеется таблица из 2 полей:

D>
D>id uniquieidentifier PK,
D>attrib varchar(100)
D>

D>Надо сделать запрос:
D> На входе у него список строк,
D> На выходе должно быть не более чем по одному id на каждую входную строку (по полю attrib).
D>Проблема в том, что attrib не является уникальным полем.
D>В случае, если attrib встречается в нескольких записях, можно выбрать любую.

я наверно не совсем понял, что требуется, distinct точно не подойдет?
Re[2]: Выбор "любого" GUID из группировки (TSQL)
От: diamondio  
Дата: 07.08.07 09:37
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>Здравствуйте, diamondio, Вы писали:


D>>Здравствуйте!


D>>Не первый раз сталкиваюсь со следующей проблемой.


D>>В MSSQL БД имеется таблица из 2 полей:

D>>
D>>id uniquieidentifier PK,
D>>attrib varchar(100)
D>>

D>>Надо сделать запрос:
D>> На входе у него список строк,
D>> На выходе должно быть не более чем по одному id на каждую входную строку (по полю attrib).
D>>Проблема в том, что attrib не является уникальным полем.
D>>В случае, если attrib встречается в нескольких записях, можно выбрать любую.

DШ>я наверно не совсем понял, что требуется, distinct точно не подойдет?


Distinct не подойдет. Они (id) и так все разные, т.к. PK. Надо выбрать один из нескольких id, которые образуются при группировке по attrib.
Re[3]: Выбор "любого" GUID из группировки (TSQL)
От: DuШes  
Дата: 07.08.07 09:50
Оценка:
Здравствуйте, diamondio, Вы писали:

[....]

без промежуточной таблицы с нормальным identity полем наверно и не получится, хотя наверно и можно....навскидку такой вариант

    create table #test    (    id        uniqueidentifier default (newid()),
                            attrib    varchar(100)
                        )

    create table #ids(        id        uniqueidentifier default (newid()),
                            attrib    varchar(100),
                            min_id    int    identity(1, 1)
                        )


    insert    into    #test (attrib)
    values ('value_01')

    insert    into    #test (attrib)
    values ('value_01')

    insert    into    #test (attrib)
    values ('value_02')

    insert    into    #test (attrib)
    values ('value_03')

    insert    into    #test (attrib)
    values ('value_03')

    insert    into    #ids
    select    * 
    from    #test

    select    *    
    from    #test T

    select    *    
    from    #ids T
    where    min_id in (select min(min_id) from #ids group by attrib)



id attrib
DA34B3DB-ABFF-47FA-890D-25072C6852AA value_01
548DBF66-8FD5-406B-AA44-07E4A19D4D43 value_01
A69B1C0B-DE71-4FE5-8C65-7F2464BC512A value_02
708E0BF2-651A-4E17-BAA6-9469D9AA1416 value_03
EFC8D122-6C09-4179-B663-F9A65E314DD4 value_03




id attrib min_id
DA34B3DB-ABFF-47FA-890D-25072C6852AA value_01 1
A69B1C0B-DE71-4FE5-8C65-7F2464BC512A value_02 3
708E0BF2-651A-4E17-BAA6-9469D9AA1416 value_03 4

Re[4]: Выбор "любого" GUID из группировки (TSQL)
От: DuШes  
Дата: 07.08.07 10:01
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>Здравствуйте, diamondio, Вы писали:


DШ>[....]


DШ>без промежуточной таблицы с нормальным identity полем наверно и не получится, хотя наверно и можно....навскидку такой вариант


подумал, можно и без промежуточной, все проще:



    select    distinct attrib,
        (select top 1 id from #test T2 where T2.attrib = T1.attrib)
    from    #test T1
Re: Выбор "любого" GUID из группировки (TSQL)
От: _d_m_  
Дата: 07.08.07 10:48
Оценка:
Здравствуйте, diamondio, Вы писали:

D>Очевидное решение выглядит так:

D>
D>select max(id)
D>from table1
D>where attrib in (<list>)
D>group by attrib
D>

D>Проблема в том, что агрегаты не принимают uniqueidentifier.

D>Может быть, есть какой-нибудь способ? Кроме
Convert(uniqueidentifier, max(convert(varchar, id)))


select
    (select top 1
        id
    from
        table1 t1
    where
        t1.attrib = a.attrib
    )
from
    (select distinct
        attrib
    from
        table1
    where
        attrib in (
            <list>
        )
    ) as a
Re[5]: Выбор "любого" GUID из группировки (TSQL)
От: diamondio  
Дата: 07.08.07 14:07
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>подумал, можно и без промежуточной, все проще:



DШ>
DШ>    select    distinct attrib,
DШ>        (select top 1 id from #test T2 where T2.attrib = T1.attrib)
DШ>    from    #test T1

DШ>


Спасибо, то что нужно!
Re[6]: Выбор "любого" GUID из группировки (TSQL)
От: diamondio  
Дата: 07.08.07 14:14
Оценка:
Здравствуйте, diamondio, Вы писали:

D>Здравствуйте, DuШes, Вы писали:


DШ>>подумал, можно и без промежуточной, все проще:



DШ>>
DШ>>    select    distinct attrib,
DШ>>        (select top 1 id from #test T2 where T2.attrib = T1.attrib)
DШ>>    from    #test T1

DШ>>


D>Спасибо, то что нужно!


Кстати, первый вариант раза в 2 быстрее будет.
Re[7]: Выбор "любого" GUID из группировки (TSQL)
От: DuШes  
Дата: 07.08.07 14:31
Оценка:
Здравствуйте, diamondio, Вы писали:

D>Здравствуйте, diamondio, Вы писали:


D>>Здравствуйте, DuШes, Вы писали:


DШ>>>подумал, можно и без промежуточной, все проще:



DШ>>>
DШ>>>    select    distinct attrib,
DШ>>>        (select top 1 id from #test T2 where T2.attrib = T1.attrib)
DШ>>>    from    #test T1

DШ>>>


D>>Спасибо, то что нужно!


D>Кстати, первый вариант раза в 2 быстрее будет.


планы несмотрел, вообще все зависит от количества записей в выборке, от наличия необходимых индексов и прочее...создание промежуточной временной таблицы тоже не есть самый хороший вариант
Re[7]: Выбор "любого" GUID из группировки (TSQL)
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.08.07 03:17
Оценка:
Здравствуйте, diamondio, Вы писали:

D>Кстати, первый вариант раза в 2 быстрее будет.

С промежуточной таблицей? Не смеши меня, посмотри планы запросов. SQL server умеет оптимизировать вложенные top 1 с версии как минимум 2000, а то и старше.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.