Как найти даты из нескольких категорий по условиям - PullRequest
1 голос
/ 20 мая 2019

Мне нужно найти данные в разных категориях: Breakground, Energization и PR в зависимости от условий.Первые две категории в порядке.Данные сопоставления один к одному.Проблема в категории PR.Есть несколько дат в этой категории.Мне нужно найти минимальное значение (MilestoneDate) в этой категории, но минимальное значение (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

С представлением управления AS (ВЫБРАТЬ * ОТ УПРАВЛЕНИЯ_ВИДОМ_МАНЧИКА m ВЛЕВО СОЕДИНИТЬ (ВЫБРАТЬ)* FROM (ВЫБЕРИТЬ projectobjectid, id AS_did_id_id_id_id_id_id_d_d_ru, конечная дата AS, Milestonedate_NAME AS, ОТДЕЛЕНИЕ активности WHERE ds = (ВЫБРАТЬ макс. (Ds) ОТ действия) UNION ALL ВЫБРАТЬ Projectobjectid, ID AS_доступной_ID, мин.WHERE id IN ('LRP-RVA-B3-FS1000', 'LRP-RVA-B3-PR1000', 'LRP-RVA-B3-PR1500') И projectobjectid = 4908 GROUP BY projectobjectid, id, NAME)) p ON try_cast(m.objectid as DOUBLE) = p.projectobjection AND m.id = p.activity_id), pr AS (SELECT *, row_number () OVER (раздел сайта BY, здание, вехи) ORDER BY try (cast (substr (milestonedate, 1), 10) AS date))) rn ОТ управленческого взгляда ГДЕ попробовать (приведение (substr (milestonedate, 1, 10) AS date))> = CURRENT_DATE AND trim (milestonetype) = 'PR') ВЫБРАТЬ сайт, построитьing, id, milestonetype, milestone, milestonedate ИЗ управленческой точки зрения WHERE milestonetype IN ('Breakground', 'Energization') UNION ALL SELECT сайт, здание, id, milestonetype, milestone, milestonedate ОТ PR ГДЕ rn = 1

запрос работает нормально, но не получил желаемого результата.Мне нужно min (MilestoneDate) в категории PR, а min (MilestoneDate) должно быть больше, чем сегодня, но ближе всего к сегодняшнему дню.Этот запрос все еще дает мне несколько MilestoneDate в категории PR.Любое предложение будет оценено

1 Ответ

0 голосов
/ 20 мая 2019

Я рекомендую использовать 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;
...