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

基于PRODUCT表的SQL查询逻辑优化与目标结果实现咨询

问题:编写SQL实现指定业务逻辑提取目标数据

现有PRODUCT表

ProductIDRecordIDProductVersionReceivedDateUrgencyLevelResolvedInvestigationDateResolvedDate
11712001-09-11 17:05:00NULL0NULLNULL
117102001-09-11 17:05:00612001-09-11 17:59:002001-09-11 20:04:00
21312001-12-04 09:05:0060NULLNULL
213112001-12-04 09:05:00512001-12-04 10:19:002001-12-04 12:07:00
37112001-06-08 12:36:00502001-06-08 12:36:00NULL
37162001-06-08 12:36:00112001-06-08 12:36:002001-06-08 13:21:00
41012001-05-01 11:00:00102001-05-01 12:00:002001-05-01 12:30:00
41032001-05-01 11:00:00112001-05-01 12:15:00NULL
52112001-07-23 09:00:00802001-07-23 10:15:00NULL
521152001-07-23 09:00:00NULL02001-05-23 10:30:00NULL

业务规则

  • 每个ProductID对应两个版本:ProductVersion=1(最低版本)和该ProductID下的最高版本;同一ProductID的ReceivedDate始终相同且非空,ResolvedDate可为空。
  • DurationInMinutes计算规则:优先取最高版本的ResolvedDate与ReceivedDate的分钟差;若最高版本ResolvedDate为空,则使用最低版本的ResolvedDate;若两者都为空,则设为NULL。
  • Resolved字段通常最低版本为0、最高版本为1,但当同一ProductID下两个版本的Resolved均为0时,需强制将最高版本的Resolved视为1。

目标输出表

ProductIDRecordIDReceivedDateFirstUrgencyLevelFinalUrgencyLevelFirstInvestigationDateFinalInvestigationDateDurationInMinutes
1172001-09-11 17:05:00NULL6NULL2001-09-11 17:59:00179
2132001-12-04 09:05:0065NULL2001-12-04 10:19:00182
3712001-06-08 12:36:00512001-06-08 12:36:002001-06-08 12:36:0045
4102001-05-01 11:00:00112001-05-01 12:00:002001-05-01 12:15:0090
5212001-07-23 09:00:008NULL2001-07-23 10:15:002001-07-23 10:30:00NULL

已尝试的SQL(未得到正确结果)

select 
    ProductID,
    RecordID,
    ReceivedDate,
    case 
        when UrgencyLevel = 0 then UrgencyLevel 
    end as FirstUrgencyLevel,
    case 
        when UrgencyLevel = 1 then UrgencyLevel 
    end as FinalUrgencyLevel,
    case 
        when UrgencyLevel = 0 then InvestigationDate 
    end as FirstInvestigationDate,
    case 
        when UrgencyLevel = 1 then InvestigationDate 
    end as FinalInvestigationDate,
    datediff(minute,ReceivedDate, ResolvedDate) as DurationInMinutes
from 
    PRODUCT

正确的SQL实现

WITH ProductVersions AS (
    -- 标记每个ProductID的最低版本(1)和最高版本,同时处理Resolved的特殊情况
    SELECT 
        *,
        CASE 
            WHEN ProductVersion = 1 THEN 'First' 
            WHEN ProductVersion = MAX(ProductVersion) OVER (PARTITION BY ProductID) THEN 'Final'
            ELSE NULL 
        END AS VersionType,
        -- 当同一ProductID下所有Resolved都是0时,最高版本Resolved视为1
        CASE 
            WHEN ProductVersion = MAX(ProductVersion) OVER (PARTITION BY ProductID) 
                 AND SUM(Resolved) OVER (PARTITION BY ProductID) = 0 THEN 1
            ELSE Resolved 
        END AS AdjustedResolved
    FROM PRODUCT
)
-- 聚合最低版本和最高版本的数据
SELECT 
    p1.ProductID,
    p1.RecordID,
    p1.ReceivedDate,
    p1.UrgencyLevel AS FirstUrgencyLevel,
    p2.UrgencyLevel AS FinalUrgencyLevel,
    p1.InvestigationDate AS FirstInvestigationDate,
    p2.InvestigationDate AS FinalInvestigationDate,
    -- 按规则计算DurationInMinutes
    DATEDIFF(MINUTE, p1.ReceivedDate, 
        CASE 
            WHEN p2.ResolvedDate IS NOT NULL THEN p2.ResolvedDate
            ELSE p1.ResolvedDate 
        END) AS DurationInMinutes
FROM ProductVersions p1
JOIN ProductVersions p2 
    ON p1.ProductID = p2.ProductID 
    AND p1.VersionType = 'First' 
    AND p2.VersionType = 'Final';

逻辑说明

  1. 通过CTE ProductVersions 标记每个ProductID的最低版本(First)和最高版本(Final),并处理Resolved字段的特殊场景。
  2. 将标记为First和Final的记录通过ProductID关联,聚合得到目标字段。
  3. 严格按照业务规则计算DurationInMinutes,优先使用最高版本的ResolvedDate,为空则 fallback 到最低版本,都为空则返回NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:54:55