1

私はテーブルを持っています:

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
group by value1 

ただし、SQLサーバーでは、彼がグループの最初のレコード(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 に答える