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](10NULL,
    [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
复制代码

 

 

posted @   Master HaKu  阅读(501)  评论(0编辑  收藏  举报
编辑推荐:
· 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)
· 程序员常用高效实用工具推荐,办公效率提升利器!
点击右上角即可分享
微信分享提示