1

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

blah something
blah somethingelse
foo blah
bar blah
foo hello

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

如果这很重要,我正在使用H2 数据库引擎

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

4 回答 4

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
于 2010-06-29T08:54:42.690 回答
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

于 2010-06-29T09:17:32.923 回答
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;
于 2010-07-03T16:44:00.010 回答
1

我认为这可以满足您的要求,但我不确定 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
于 2010-06-29T08:46:49.227 回答