【问题标题】:How to find dates from multiple categories by conditions如何按条件从多个类别中查找日期
【发布时间】:2019-10-06 09:30:32
【问题描述】:

我需要根据条件找到不同类别的数据:Breakground、Energization 和 PR。前两个类别很好。数据是一对一的映射。问题是公关类别。此类别中有多个日期。我需要在此类别中找到 min(MilestoneDate),但 min(MilesotoneDate) 必须大于今天并且最接近今天。

Following are table data:

Site   Building       MilestoneID   MilestoneType  MilestoneDate
 AGE     building1     MIC.MS.1000    Breakground    1/1/18
 AGE     building1     MIC.ACT.1000   Energization   2/3/19
 AGE     building1     PTM.B1.1130    PR             2/5/19
 AGE     building1     PTM.B1.1140    PR             3/4/20
 AGE     building1     PTM.B1.1150    PR             12/25/20
 AGE     building1     PTM.B1.1160    PR             5/25/22
 AGE     building2     MIC.MS.1000    Breakground    2/2/19
 AGE     building2     MIC.ACT.1000   Energization   12/5/19
 AGE     building2     PTM.B2.1130    PR             3/5/20
 AGE     building2      PTM.B2.1140   PR             8/10/20
 AGE     building2      PTM.B2.1150   PR             3/4/21
 AGE     building2      PTM.B2.1160   PR             5/4/22
 OCA     building1     MIC.MS.1000    Breakground    4/2/19
 OCA     building1     MIC.ACT.1000   Energization   5/4/20  
 OCA     building1      PTM.B1.1130   PR             6/8/21
 OCA     building1     PTM.B1.1140    PR             12/2/21
 OCA     building1     PTM.B1.1150    PR             3/5/22
 OCA     building1     PTM.B1.1160    PR             12/30/22

WITH 管理视图 AS ( 选择 * FROM management_view_nancy m 左连接 ( 选择 * 从 ( 选择项目对象ID, id 作为activity_id, 完成日期作为里程碑日期, 命名为里程碑 从活动 哪里 ds = ( 选择最大值(ds) 来自活动) 联合所有 选择项目对象ID, id 作为activity_id, Min(finishdate) 作为完成日期, 姓名 从活动 在哪里 id ('LRP-RVA-B3-FS1000', 'LRP-RVA-B3-PR1000', 'LRP-RVA-B3-PR1500') AND 项目对象 ID = 4908 按项目对象ID分组, ID, 名称))p ON try_cast(m.objectid as DOUBLE) = p.projectobjection AND m.id = p.activity_id ) , pr AS ( 选择 *, row_number() OVER (按站点、建筑物、里程碑类型进行分区 ORDER BY try(cast(substr(milestonedate, 1, 10) AS date))) rn FROM管理视图 WHERE try(cast(substr(milestonedate, 1, 10) AS date)) >= CURRENT_DATE 和修剪(里程碑类型)='公关') 选择网站, 建筑, ID, 里程碑类型, 里程碑, 里程碑日期 FROM管理视图 WHERE 里程碑类型 IN ('Breakground', '通电') 联合所有 选择网站, 建筑, ID, 里程碑类型, 里程碑, 里程碑日期 来自公关 其中 rn = 1

查询工作正常,但没有得到我想要的结果。我需要 PR 类别中的 min(MilestoneDate),min(MilestoneDate) 应该大于今天但最接近今天。这个查询仍然给了我 PR 类别中的多个 MilestoneDate。任何建议将不胜感激

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    我建议使用 CTE 来引入您想要保留的 PR 数据点:

    WITH cte AS (
        SELECT *,
            ROW_NUMBER() OVER (PARTITION BY Site, Building ORDER BY MilestoneDate) rn
        FROM managementview
        WHERE MilestoneDate >= CURRENT_DATE AND milestonetype = 'PR'
    )
    
    SELECT site, building, id, milestonetype, milestone, milestonedate
    FROM managementview
    WHERE milestonetype IN ('Breakground', 'Energization')
    UNION ALL
    SELECT site, building, id, milestonetype, milestone, milestonedate
    FROM cte
    WHERE rn = 1;
    

    如果您的 Presto 版本不支持 CTE,请尝试内联:

    SELECT site, building, id, milestonetype, milestone, milestonedate
    FROM managementview
    WHERE milestonetype IN ('Breakground', 'Energization')
    UNION ALL
    SELECT site, building, id, milestonetype, milestone, milestonedate
    FROM
    (
        SELECT m.*,
            ROW_NUMBER() OVER (PARTITION BY Site, Building ORDER BY MilestoneDate) rn
        FROM managementview m
        WHERE MilestoneDate >= CURRENT_DATE AND milestonetype = 'PR'
    ) t
    WHERE rn = 1;
    

    【讨论】:

    • 嗨蒂姆,感谢您的帮助。你的解决方案很棒。我正在尝试将您的解决方案与我的集成。但我收到此错误消息:Generic_internal_error) 内部错误。不确定查询中哪个部分出错。使用 ManagementView 作为 (
    • @Nancy 如果你只运行 SELECT * FROM cte 会发生什么?
    • 嗨,蒂姆,我发布了修改后的查询。我在我的查询中集成了你的,但有错误消息。它说“内部错误”。抱歉上面的代码很乱。
    • 很遗憾,如果我看不到更准确的错误信息,我什至无法猜测我的答案可能有什么问题。
    • 使用 ManagementView 作为 ( ) 这是我的第一个 CTE。它有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2020-08-29
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多