2011-11-01 145 views
0

我需要为每个company_name和node_name获取表T_TBL_DATA中的第一个文本(具有最低row_id的行)。例如:查询选择组中的特定行

SELECT company_name, node_name, [text] 
FROM T_TBL_DATA 
GROUP BY company_name, node_name 
WHERE the selected [text] is from the row with the smallest row_id within each group 

任何想法?

+1

什么ID节点或公司??????????? –

+0

@Royi Namir:row_id。我更新了这个问题。 – Naor

+0

@Naor只是一个想法,如果你的表的主键是公司ID或节点ID之一,逻辑上你会有一个序列。所以如果你可以采取最低限度,你会得到最好的查询根据我 –

回答

1
select company_id, node_id, [text] 
from t_tbl_data 
where row_id in 
(
    select min(row_id) 
    from t_tbl_data 
    group by company_id, node_id 
) 
+0

我更新了问题。 – Naor

+0

@Naor仍然没有足够的信息,什么决定了你的行的排列方式?什么使得company_id/node_id组合在最上面? – 2011-11-01 16:01:35

+0

对于表中的每个company_name和node_name,我需要第一个创建的行的文本(我可以通过row_id列确定)。 – Naor

0

假设id是唯一的。 数据库无关的解决方案在一定程度上:

select 
    company_id, node_id, (select txt from T_TBL_DATA t2 where t2.id = min(t1.id)) 
from T_TBL_DATA t1 
group by company_id, node_id 

对于MS SQL Server 2005和更高一点点简单:

-- ============= 
-- sample data 
-- ============= 
declare @t table 
(
    id int, 
    company_id int, 
    node_id int, 
    txt varchar(50) 
) 

insert into @t values (1, 1, 1, 'abc1') 
insert into @t values (2, 1, 1, 'abc2') 
insert into @t values (3, 1, 2, 'abc3') 
insert into @t values (4, 1, 2, 'abc4') 
insert into @t values (5, 2, 1, 'abc5') 
insert into @t values (6, 2, 1, 'abc6') 
insert into @t values (7, 2, 2, 'abc7') 
insert into @t values (8, 2, 2, 'abc8') 

-- ============= 
-- solution 
-- ============= 
select 
    company_id, node_id, txt 
from 
(
    select 
     *, 
     id2 = min(id) over(partition by company_id, node_id) 
    from @t 
) t 
where id = id2