指定しない限り、データには順序がありません。
select
x as 1,
y as 2 ,
z as 3 ,
row_number() over (order by whatever),
case when row_number() over (order by whatever) = 1 then 'first'
else
case when row_number() over (order by whatever desc) = 1 then 'last'
else 'middle'
end
end
from table abc
inner join xyz on a = x
where x= 123
上記のクエリでは、WHERE 句の代わりに ANSI-92 結合を使用していることに注意してください。
共通テーブル式を使用して、これをさらに最適化できる場合があります
;with cte as
(
select
x ,
y ,
z ,
row_number() over (order by whatever) rn
from table abc
inner join xyz on a = x
where x= 123
)
select x,y,z,rn,
case rn when 1 then 'first'
when (select MAX(rn) from cte) then 'last'
else 'middle'
end
from cte
または、次のような CTE なし:
select
x as 1,
y as 2 ,
z as 3 ,
row_number() over (order by whatever),
case row_number() over (order by whatever)
when 1 then 'first'
when count(*) over () then 'last'
else 'middle'
end
from table abc
inner join xyz on a = x
where x= 123