Postgresql:标记组的第一行

Postgresql:标记组的第一行,sql,postgresql,conditional,case,Sql,Postgresql,Conditional,Case,我有一张这样的桌子: id | group_id | name ------------------------ 1 | 1 | richard 2 | 1 | ray 3 | 2 | enzo 4 | 2 | shiela 5 | 2 | anne 我在选择每个组时没有问题,但是我想按组id标记每个组的第一个匹配项。然后将其添加为列,以标记该行是该组的第一个匹配项 例如,Richard代表第一组,Enzo代表第二

我有一张这样的桌子:

id | group_id | name
------------------------
1  |    1     | richard
2  |    1     | ray
3  |    2     | enzo
4  |    2     | shiela
5  |    2     | anne
我在选择每个组时没有问题,但是我想按组id标记每个组的第一个匹配项。然后将其添加为列,以标记该行是该组的第一个匹配项

例如,Richard代表第一组,Enzo代表第二组等等

我应该能够使用:

         select
         t.* 
           case
           when (condition)
           ...(boolean result here)
           end as is_first_row
         from t
结果如下:

id | group_id | name    |is_first_row
-------------------------------
1  |    1     | richard | t
2  |    1     | ray     | f
3  |    2     | enzo    | t
4  |    2     | shiela  | f
5  |    2     | anne    | f
如何为select查询制定条件语句?

使用

选择行号以查看其工作方式。按组id在分区中计算行号,即按id顺序分别计算每个组id的行号:

使用

选择行号以查看其工作方式。按组id在分区中计算行号,即按id顺序分别计算每个组id的行号:


请检查我的答案,如果逻辑有错误,请告诉我

Create Table #Temp(id int,group_id int,name nvarchar(max))

 Insert into #Temp values
 (1,1,'richard')
,(2,1,'ray')
,(3,2,'enzo')
,(4,2,'shiela')
,(5,2,'anne')

Select t2.id,t2.group_id,t2.name,t1.group_id_c, case
when t1.group_id_c=1 then 't'
else 'f'
end  AS is_firstrow from #temp t2 join 
(Select t.*, row_number() over (partition by group_id order by id) as group_id_c from #Temp t ) t1
on t1.id=t2.id

请检查我的答案,如果逻辑有错误,请告诉我

Create Table #Temp(id int,group_id int,name nvarchar(max))

 Insert into #Temp values
 (1,1,'richard')
,(2,1,'ray')
,(3,2,'enzo')
,(4,2,'shiela')
,(5,2,'anne')

Select t2.id,t2.group_id,t2.name,t1.group_id_c, case
when t1.group_id_c=1 then 't'
else 'f'
end  AS is_firstrow from #temp t2 join 
(Select t.*, row_number() over (partition by group_id order by id) as group_id_c from #Temp t ) t1
on t1.id=t2.id

哇!这真的很快,我已经看了关于over子句和partition by的文档,但是现在还没有弄清楚,您介意展示一下它在这个上下文中是如何工作的吗?顺便说一句,谢谢。哇!这真的很快,我已经看了关于over子句和partition by的文档,但是现在还没有弄清楚,您介意展示一下它在这个上下文中是如何工作的吗?谢谢你。
Create Table #Temp(id int,group_id int,name nvarchar(max))

 Insert into #Temp values
 (1,1,'richard')
,(2,1,'ray')
,(3,2,'enzo')
,(4,2,'shiela')
,(5,2,'anne')

Select t2.id,t2.group_id,t2.name,t1.group_id_c, case
when t1.group_id_c=1 then 't'
else 'f'
end  AS is_firstrow from #temp t2 join 
(Select t.*, row_number() over (partition by group_id order by id) as group_id_c from #Temp t ) t1
on t1.id=t2.id