SQL-запрос для выбора только первых вхождений строк с одинаковыми данными в первом столбце - PullRequest
1 голос
/ 29 июня 2010

Существует ли аккуратный SQL-запрос, который бы возвращал строки, чтобы возвращались только первые вхождения строк, которые имеют одинаковые данные в первом столбце? То есть, если у меня есть строки, такие как

blah something
blah somethingelse
foo blah
bar blah
foo hello

запрос должен дать мне первую, третью и четвертую строки (поскольку первая строка - это первое вхождение «бла» в первом столбце », третья строка - это первое вхождение« foo »в первом столбце, а четвертая строка - это первое вхождение "bar" в первом столбце).

Я использую ядро ​​базы данных H2 , если это имеет значение.

Обновление: извините за неясное определение таблицы, вот оно лучше; «бла», «foo» и т. д. обозначают значение первого столбца в строке.

blah [rest of columns of first row]
blah [rest of columns of second row]
foo  [-""- third row]
bar  [-""- fourth row]
foo  [-""- fifth row]

Ответы [ 4 ]

3 голосов
/ 29 июня 2010

Если вы имели в виду в столбце 2 в алфавитном порядке, вот несколько SQL для получения этих строк:

create table #tmp (
    c1 char(20),
    c2 char(20)
)
insert #tmp values ('blah','something')
insert #tmp values ('blah','somethingelse')
insert #tmp values ('foo','ahhhh')
insert #tmp values ('foo','blah')
insert #tmp values ('bar','blah')
insert #tmp values ('foo','hello')

select c1, min(c2) c2 from #tmp
group by c1
2 голосов
/ 29 июня 2010

Аналитический запрос может помочь.

Select *
from (
    Select rank(c1) over (partition by c1) as myRank, t.*
    from myTable t )
where myRank = 1

Но это только приоритет 2 для V1.3.X

http://www.h2database.com/html/roadmap.html?highlight=RANK&search=rank#firstFound

1 голос
/ 03 июля 2010

Если вас интересует самый быстрый запрос: относительно важно иметь индекс в первом столбце таблицы.Таким образом, обработчик запросов может сканировать значения из этого индекса.Тогда самым быстрым решением, вероятно, будет использование «внешнего» запроса для получения различных значений c1, плюс «внутренний» или вложенный запрос для получения одного из возможных значений второго столбца:

drop table test;
create table test(c1 char(20), c2 char(20));
create index idx_c1 on test(c1);

-- insert some data (H2 specific)
insert into test select 'bl' || (x/1000), x from system_range(1, 100000); 

-- the fastest query (64 ms)
select c1, (select i.c2 from test i where i.c1=o.c1 limit 1) from test o group by c1;

-- the shortest query (385 ms)
select c1, min(c2) c2 from test group by c1;
1 голос
/ 29 июня 2010

Я думаю, это делает то, что вы хотите, но я не уверен на 100%.(Также на основе MS SQL Server.)

create table #t
(
PKCol int identity(1,1),
Col1 varchar(200)
)

Insert Into #t
Values ('blah something')
Insert Into #t
Values ('blah something else')
Insert Into #t
Values ('foo blah')
Insert Into #t
Values ('bar blah')
Insert Into #t
Values ('foo hello')


Select t.*
From #t t
Join (
     Select min(PKCol) as 'IDToSelect'
     From #t
     Group By Left(Col1, CharIndex(space(1), col1))
)q on t.PKCol = q.IDToSelect

drop table #t
...