如何按条件从多个类别中查找日期
How to find dates from multiple categories by conditions
我需要根据条件查找不同类别的数据: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 managementview AS
(
SELECT *
来自 management_view_nancy 米
左连接
(
SELECT *
从 (
SELECT projectobjectid,
id AS activity_id,
完成日期作为里程碑日期,
命名为里程碑
来自 activity
其中 ds =
(
SELECT 最大值(ds)
来自 activity)
联合所有
SELECT projectobjectid,
id AS activity_id,
Min(finishdate) AS 完成日期,
姓名
来自 activity
其中 id 在 ('LRP-RVA-B3-FS1000',
'LRP-RVA-B3-PR1000',
'LRP-RVA-B3-PR1500')
AND projectobjectid = 4908
GROUP BY projectobjectid,
ID,
姓名) ) p
ON try_cast(m.objectid 作为 DOUBLE) = p.projectobjection
AND m.id = p.activity_id ) , pr AS
(
SELECT *,
row_number() OVER (partition BY site, building, milestonetype ORDER BY try(cast(substr(milestonedate, 1, 10) AS date))) rn
FROM管理视图
WHERE try(cast(substr(milestonedate, 1, 10) AS date)) >= CURRENT_DATE
AND trim(里程碑类型)= 'PR')
SELECT 网站,
建造,
ID,
里程碑类型,
里程碑,
里程碑日期
FROM管理视图
WHERE milestonetype IN ('Breakground',
'Energization')
联合所有
SELECT 网站,
建造,
ID,
里程碑类型,
里程碑,
里程碑日期
从公关
其中 rn = 1
查询正常,但没有得到我想要的结果。我需要 PR 类别中的 min(MilestoneDate),并且 min(MilestoneDate) 应该大于今天但最接近今天。此查询仍然在 PR 类别中为我提供多个 MilestoneDate。任何建议将不胜感激
我建议使用 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;
我需要根据条件查找不同类别的数据: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 managementview AS ( SELECT * 来自 management_view_nancy 米 左连接 ( SELECT * 从 ( SELECT projectobjectid, id AS activity_id, 完成日期作为里程碑日期, 命名为里程碑 来自 activity 其中 ds = ( SELECT 最大值(ds) 来自 activity) 联合所有 SELECT projectobjectid, id AS activity_id, Min(finishdate) AS 完成日期, 姓名 来自 activity 其中 id 在 ('LRP-RVA-B3-FS1000', 'LRP-RVA-B3-PR1000', 'LRP-RVA-B3-PR1500') AND projectobjectid = 4908 GROUP BY projectobjectid, ID, 姓名) ) p ON try_cast(m.objectid 作为 DOUBLE) = p.projectobjection AND m.id = p.activity_id ) , pr AS ( SELECT *, row_number() OVER (partition BY site, building, milestonetype ORDER BY try(cast(substr(milestonedate, 1, 10) AS date))) rn FROM管理视图 WHERE try(cast(substr(milestonedate, 1, 10) AS date)) >= CURRENT_DATE AND trim(里程碑类型)= 'PR') SELECT 网站, 建造, ID, 里程碑类型, 里程碑, 里程碑日期 FROM管理视图 WHERE milestonetype IN ('Breakground', 'Energization') 联合所有 SELECT 网站, 建造, ID, 里程碑类型, 里程碑, 里程碑日期 从公关 其中 rn = 1
查询正常,但没有得到我想要的结果。我需要 PR 类别中的 min(MilestoneDate),并且 min(MilestoneDate) 应该大于今天但最接近今天。此查询仍然在 PR 类别中为我提供多个 MilestoneDate。任何建议将不胜感激
我建议使用 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;