是否有一个简洁的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]
答案 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;