1

我有一张桌子:

ID | value1 |value2
1  | 15     | A
2  | 15     | B
3  | 16     | D
4  | 16     | A
5  | 16     | C

作为结果,我只想看到 value1 的第一条记录(分组依据?),如下所示:

ID | value1 |value2
1  | 15     | A
2  | 16     | D

我可以这样做:

select * from vals
group by value1 

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

4

4 回答 4

4

你实际上不能这样做:

select * from vals
group by value1 

因为那甚至不会执行,并且会带回每一行,因为ID每一行都不同。因此,如果您尝试为每个获取第一行,value1那么您可以执行以下操作:

select * from vals
where id in (select min(id) from vals group by value1)

这将使您获得每组的第一行value1

于 2013-03-28T15:39:06.237 回答
1
;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
于 2013-03-28T15:41:37.487 回答
1

你当然可以:

 Select * From vals v
 Where id = (Select Min(id)
             From vals 
             Where value1 = v.value1)
于 2013-03-28T15:41:57.537 回答
1

由于您使用的是 SQL Server,因此可以使用窗口函数 ( row_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 Fiddle

于 2013-03-28T15:42:16.930 回答