SQL第一组

SQL第一组,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有一张桌子: ID | value1 |value2 1 | 15 | A 2 | 15 | B 3 | 16 | D 4 | 16 | A 5 | 16 | C 作为结果,我只希望看到value1的第一条记录(group by?) 像这样: ID | value1 |value2 1 | 15 | A 2 | 16 | D select * from vals where id in (select min(id) f

我有一张桌子:

ID | value1 |value2
1  | 15     | A
2  | 15     | B
3  | 16     | D
4  | 16     | A
5  | 16     | C
作为结果,我只希望看到value1的第一条记录(group by?) 像这样:

ID | value1 |value2
1  | 15     | A
2  | 16     | D
select * from vals
where id in (select min(id) from vals group by value1)
我可以这样做:

select * from vals
group by value1 

但是,在SQL server中,我是否始终确保他获取组中的第一条记录(ID最低)?

您实际上不能这样做:

select * from vals
group by value1 
因为这甚至不会执行,而且它会返回每一行,因为
ID
在每一行上都不同。因此,如果您试图为每个
value1
获取第一行,则可以执行以下操作:

ID | value1 |value2
1  | 15     | A
2  | 16     | D
select * from vals
where id in (select min(id) from vals group by value1)

通过
value1

这将使您获得每个组的第一行,但实际上您不能这样做:

select * from vals
group by value1 
;WITH cte AS 
(
    SELECT MIN(id)AS id FROM vals
    GROUP BY value1 
)
SELECT vals.* FROM cte
INNER JOIN vals ON vals.id = cte.id
因为这甚至不会执行,而且它会返回每一行,因为
ID
在每一行上都不同。因此,如果您试图为每个
value1
获取第一行,则可以执行以下操作:

ID | value1 |value2
1  | 15     | A
2  | 16     | D
select * from vals
where id in (select min(id) from vals group by value1)
通过
value1

确定您可以:

;WITH cte AS 
(
    SELECT MIN(id)AS id FROM vals
    GROUP BY value1 
)
SELECT vals.* FROM cte
INNER JOIN vals ON vals.id = cte.id
 Select * From vals v
 Where id = (Select Min(id)
             From vals 
             Where value1 = v.value1)
当然你可以:

 Select * From vals v
 Where id = (Select Min(id)
             From vals 
             Where value1 = v.value1)

由于您使用的是SQL Server,因此可以使用窗口功能(
row\u number()
)来获得结果:

select id, value1, value2
from
(
  select id, value1, value2,
    row_number() over(partition by value1 order by id) rn
  from vals
) d
where rn = 1;
也可以使用子查询:

select v1.id, v1.value1, v1.value2
from vals v1
inner join
(
  select min(id) id, value1
  from vals
  group by value1
) v2
  on v1.id = v2.id
  and v1.value1 = v2.value1

请参阅这两个查询中的一个,因为您使用的是SQL Server,所以可以使用窗口功能(
行编号()
)来获得结果:

select id, value1, value2
from
(
  select id, value1, value2,
    row_number() over(partition by value1 order by id) rn
  from vals
) d
where rn = 1;
也可以使用子查询:

select v1.id, v1.value1, v1.value2
from vals v1
inner join
(
  select min(id) id, value1
  from vals
  group by value1
) v2
  on v1.id = v2.id
  and v1.value1 = v2.value1

请参阅这两个查询中的一个,这将不起作用,您不能在返回两列时引入子查询。这里不需要value1。@NenadZivkovic,是的,谢谢,这是一个复制粘贴错误。Michael,这不起作用,您不能在返回两列时引入子查询。这里不需要value1。@NenadZivkovic,是的,谢谢,这是一个复制粘贴错误。