SQL查询,用于仅选择第一列中具有相同数据的第一次出现的行

时间:2010-06-29 08:38:26

标签: sql h2

是否有一个简洁的SQL查询会返回行,以便只返回第一列中具有相同数据的第一次出现的行?也就是说,如果我有像

这样的行
blah something
blah somethingelse
foo blah
bar blah
foo hello

查询应该给我第一行,第三行和第四行(因为第一行是第一列中出现的“blah”,第三行是第一列中出现的“foo”,第四行是第四行row是第一列中第一次出现“bar”。

我正在使用H2 database engine,如果重要的话。

更新:对不清楚的表定义感到抱歉,这里更好; “blah”,“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 个答案:

答案 0 :(得分:3)

如果你在第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

答案 1 :(得分:2)

分析请求可以解决问题。

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

但这只是V1.3.X的优先级2

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

答案 2 :(得分:1)

我认为这可以满足您的需求,但我并非百分之百确定。 (也基于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

答案 3 :(得分:1)

如果您对最快的查询感兴趣:在表的第一列上有一个索引是相对重要的。这样查询处理器就可以扫描该索引中的值。然后,最快的解决方案可能是使用“外部”查询来获取不同的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;