我有一个包含BedTypes和RoomID列的表,如下所示.

BedType RoomId FirstName
Double 4 Andrew
Double 4 Janet
Double 5 Anne
Double 5 Robert
Double 7 Michael
Double 7 Steven
Triple 8 Howard
Triple 8 John
Triple 8 Carlos
Triple 9 Jaime
Triple 9 Giovanni
Triple 9 Rene
Double 10 Alejandra
Double 10 Pascale
Single 11 Paolo

我收到了这个表的查询如下;

SELECT B.Name 'BedType',Ro.Id'RoomId',C.FirstName From Customers C
JOIN Rooms Ro ON Ro.Id = C.RoomId 
JOIN BedTypes B ON B.Id = Ro.BedTypeId 
ORDER BY Ro.ReservationId

我无法解决的问题是,我想做一个"基于字符串的专栏".如果房间的床类型是Double,我只需要一个Double Cell,第二个Customer的BedType单元格将为空,如下表所示.

BedType RoomId FirstName
Double 4 Andrew
4 Janet
Double 5 Anne
5 Robert
Double 7 Michael
7 Steven
Triple 8 Howard
8 John
8 Carlos
Triple 9 Jaime
9 Giovanni
9 Rene
Double 10 Alejandra
10 Pascale
Single 11 Paolo

我try 编写一个查询,如下所示,但到目前为止我无法成功:

SELECT
( 
CASE WHEN B.Id =1  THEN  (SELECT Ro.Id  ) 
WHEN B.Id =3 THEN NULL 
WHEN B.Id = 4 THEN Null 
END  )  AS Trial
,B.Name 'BedType',Ro.Id'RoomId',C.FirstName From Customers C
JOIN Rooms Ro ON Ro.Id = C.RoomId 
JOIN BedTypes B ON B.Id = Ro.BedTypeId 
ORDER BY Ro.ReservationId

推荐答案

正如@Thom A在 comments 中提到的,这可以使用窗口函数lagcase子句来完成:

select case when lag_BedType is null then BedType else null end as BedType, RoomId, FirstName
from (
  select *, lag(BedType) over (partition by RoomId order by FirstName) as lag_BedType
  from mytable
) s

也可以使用row_number()来完成,其中每个房间只有第一条记录应该由BedType填充:

select case when rn = 1 then BedType else null end as BedType, RoomId, FirstName
from (
  select *, row_number() over (partition by RoomId order by FirstName) as rn
  from mytable
) s

Demo here

Sql相关问答推荐

解析键-值对,根据值 Select ,并使用SQL创建新列

Postgres trunc_date删除一个月

Android房间fts4匹配语法AND OR

编写一个SQL查询来返回收视率较高的类型,并取这些收视率的平均值,我该如何做呢?

PostgreSQL:使用JSONB中的字段使用jsonb_to_Records()填充记录

按日期时间(不包括秒)连接表

冲突查询的UPDATE时违反非空约束

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

将JSON文件导入Postgres 16数据库时出错(22P04上次预期列之后的额外数据)

删除所有订单中可用的重复值

使用特定的Order By子句随机化SQL输出

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

Athena 计算从日期到当前时间戳的每月计数

删除行而不使数据库超载

MySQL中的递归查询邻接表深度优先?

用户定义的标量值函数是否仍然会阻止并行性?

PostgreSQL如何将Unix纪元时间戳转换为日期时间并进行拼接

SQL获取两个日期范围之间的计数

如何将多行的查询结果合并为一行

将单行中的多个行值转换为列