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