You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于数据范围生成额外行的更高效SQL实现方案问询

简洁实现产品有效期与冻结时段的记录拆分

现有产品数据存储了产品的整体有效期和冻结时段,需要按规则拆分出不同状态的记录。原表结构及测试数据如下:

CREATE TABLE #Products(
    [ProductId] [int] NULL,
    [Product] [nvarchar](255) NULL,
    [Startdate] [date] NULL,
    [Enddate] [date] NULL,
    [Startdate_blocked] [date] NULL,
    [Enddate_blocked] [date] NULL
) 

INSERT INTO #Products(
[ProductId] ,
[Product] ,
[Startdate] ,
[Enddate] ,
[Startdate_blocked] ,
[Enddate_blocked]
)
VALUES('33',    'PRODUCTNUMBER33',  '2010-01-01',   NULL,   '2018-10-01',   NULL)
     ,('36',    'PRODUCTNUMBER36',  '2010-01-01',   NULL,   '2018-11-01',   NULL)
     ,('58',    'PRODUCTNUMBER58',  '2010-01-01',   NULL,   '2018-10-01',   '2020-10-30')
     ,('75',    'PRODUCTNUMBER75',  '2010-01-01',   NULL,   '2020-01-01',   '2020-07-07')
     ,('80',    'PRODUCTNUMBER80',  '2010-01-01',   '2015-08-31',   NULL,   NULL)

拆分规则

  • 产品整体有效期的valid_till:若原Enddate为NULL,替换为'2999-12-31'表示永久有效
  • 当Startdate_blocked不为空时:
    • 生成frozen状态记录:valid_from = Startdate_blocked,valid_till = 若Enddate_blocked为NULL则用'2999-12-31',否则用Enddate_blocked
    • 生成active状态记录:valid_from = Startdate,valid_till = Startdate_blocked
  • 当Startdate_blocked为空时:
    • 仅生成active状态记录:valid_from = Startdate,valid_till = 处理后的原Enddate

简洁实现方案(替代重复UNION)

使用CROSS APPLY配合值列表动态生成所需记录,避免重复编写字段逻辑:

SELECT 
    p.ProductId,
    p.Product,
    s.Status,
    s.Valid_From,
    -- 统一处理有效期的NULL情况
    COALESCE(s.Valid_Till, '2999-12-31') AS Valid_Till
FROM #Products p
CROSS APPLY (
    -- 生成active状态记录
    SELECT 
        'active' AS Status,
        p.Startdate AS Valid_From,
        CASE WHEN p.Startdate_blocked IS NOT NULL THEN p.Startdate_blocked ELSE p.Enddate END AS Valid_Till
    UNION ALL
    -- 仅当存在冻结时段时生成frozen记录
    SELECT 
        'frozen' AS Status,
        p.Startdate_blocked AS Valid_From,
        p.Enddate_blocked AS Valid_Till
    WHERE p.Startdate_blocked IS NOT NULL
) s
ORDER BY p.ProductId, s.Status DESC;

预期输出

ProductIdProductStatusValid_FromValid_Till
33PRODUCTNUMBER33active2010-01-012018-10-01
33PRODUCTNUMBER33frozen2018-10-012999-12-31
36PRODUCTNUMBER36active2010-01-012018-11-01
36PRODUCTNUMBER36frozen2018-11-012999-12-31
58PRODUCTNUMBER58active2010-01-012018-10-01
58PRODUCTNUMBER58frozen2018-10-012020-10-30
75PRODUCTNUMBER75active2010-01-012020-01-01
75PRODUCTNUMBER75frozen2020-01-012020-07-07
80PRODUCTNUMBER80active2010-01-012015-08-31

内容的提问来源于stack exchange,提问作者Eseosa Omoregie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:05:14