分享

SQL查询每组第一条数据记录

 herowuking 2014-12-13

问题描述如下:

有一些program,每个program可能暂时无联系人,有一个联系人或不止一个联系人。需要找出每个program的一个联系人即可(没有则空)。即:SQL查询每组的第一条数据记录。

 

测试表如下:

复制代码
create table test
(
    program_id int,
    person_id int
);

insert test
select     1,1
union select    1,2
union select     2,3
union select     2,4
复制代码

 

解决方案如下:

复制代码
select
    program_id,
    person_id    
from
    test as a
where
    a.person_id in 
    (
        select
            top 1
            person_id
        from
            test
        where
            program_id = a.program_id
    )
复制代码

 

执行计划如下:

Filter & Nested Loops中的Actual Number of Rows为2。

 

SQL的执行概括如下:

1)扫描test as a。提出一条记录。

2)  扫描test,提出与上述记录program_id相同的记录。

3)  提出这些记录中的top 1。

4)转到1)中,提下一条记录。

复制代码
a = test;
b = test;
result;
for (int i = 0; i < a.rows_number; i++)
{
  for (int j = 0; j < b.rows_number; j++)
  {
    temp;
    if ( b.program_id == a.program_id )
      temp.add();
    result.add(temp.first());
  }
}
复制代码

 #1楼 2012-12-27 22:52 马非码  

用partition分组+rownumber效率会更高

#2楼[楼主] 2012-12-28 16:57 caigen  

@马非码
Tks。改天示例加在正文后面。:)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多