cte结合partition - 一道复杂的sql面试题
今天别人问了我一道复杂的sql面试题, 题目是这样的:
--code 价格 时间
'0010' 100 '2012-08-01 00:00:00.000'
'0010' 100 '2012-08-02 00:00:00.000'
'0010' 100 '2012-08-03 00:00:00.000'
'0010' 100 '2012-08-05 00:00:00.000'
'0012' 120 '2012-08-07 00:00:00.000'
'0012' 120 '2012-08-08 00:00:00.000'
上面是原始数据集,
由上面的数据集,根据时间连续原则, 需要得到下面的结果集
--结果集
--code 价格 开始时间 结束时间
'0010' 100 '2012-08-01' '2012-08-03'
'0010' 100 '2012-08-05' '2012-08-05'
'0012' 120 '2012-08-07' '2012-08-08'
建表语句如下:
CREATE TABLE [dbo].[MyOrder](
[code] [varchar](10) NULL,
[price] [int] NULL,
[time] [datetime] NULL
) ON [PRIMARY]
GO
[code] [varchar](10) NULL,
[price] [int] NULL,
[time] [datetime] NULL
) ON [PRIMARY]
GO
解决代码如下, 一会儿再给你分析我的思路
with cteMinOrder
as
(
select code, MIN(time) as min_time
from MyOrder
group by code
),
cteMyOrder
as
(
SELECT *, Rank()
Over(Partition by code Order BY time) AS rownum
FROM MyOrder
),
cteCompOrder
as
(
select a.code, a.price, a.time, a.rownum,
b.min_time, DATEADD(day, rownum - 1, b.min_time) AS ctime
from cteMyOrder a left join cteMinOrder b
on a.code = b.code
)
select code, price, MIN(time) as start_time, MAX(time) as end_time
from cteCompOrder
where time=ctime
group by code, price
union all
select code, price, MIN(time) as start_time, MAX(time) as end_time
from cteCompOrder
where time!=ctime
group by code, price
order by code
as
(
select code, MIN(time) as min_time
from MyOrder
group by code
),
cteMyOrder
as
(
SELECT *, Rank()
Over(Partition by code Order BY time) AS rownum
FROM MyOrder
),
cteCompOrder
as
(
select a.code, a.price, a.time, a.rownum,
b.min_time, DATEADD(day, rownum - 1, b.min_time) AS ctime
from cteMyOrder a left join cteMinOrder b
on a.code = b.code
)
select code, price, MIN(time) as start_time, MAX(time) as end_time
from cteCompOrder
where time=ctime
group by code, price
union all
select code, price, MIN(time) as start_time, MAX(time) as end_time
from cteCompOrder
where time!=ctime
group by code, price
order by code
技术改变世界
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!