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,是的,谢谢,这是一个复制粘贴错误。