вот моя версия
--temp data
if object_id('tempdb..#x') is not null drop table #x
CREATE TABLE #x(type_id INT, name VARCHAR(1), comments VARCHAR(20))
INSERT INTO #x(type_id, name, comments) VALUES
( 61, 'a', 'aa'),
( 62, 'a', 'Test2'),
( 62, 'b', 'bb'),
( 63, 'c', 'cc'),
( 63, 'b', 'bb'),
(63, 'c', 'bb'),
(64, 'c', 'cc')
--query
SELECT CASE WHEN type_id=LAG(type_id,1,0) OVER(ORDER BY type_id) THEN NULL ELSE type_id END AS 'type_id',
name, comments
FROM #x
выход
type_id name comments
61 a aa
62 a Test2
NULL b bb
63 c cc
NULL b bb
NULL c bb
64 c cc
Если у вас нет LAG, как заявляет запрашивающий
if object_id('tempdb..#x') is not null drop table #x
CREATE TABLE #x(type_id INT, name VARCHAR(1), comments VARCHAR(20))
INSERT INTO #x(type_id, name, comments) VALUES
( 61, 'a', 'aa'),
( 62, 'a', 'Test2'),
( 62, 'b', 'bb'),
( 63, 'c', 'cc'),
( 63, 'b', 'bb'),
(63, 'c', 'bb'),
(64, 'c', 'cc')
if object_id('tempdb..#a') is not null drop table #a
SELECT x.*,
ROW_NUMBER() OVER(PARTITION BY x.type_id ORDER BY x.type_id) AS 'id_count'
INTO #a
FROM #x AS x
SELECT CASE WHEN a.id_count>1 THEN NULL ELSE a.type_id END AS 'type_id',
a.name, a.comments
FROM #a AS a