Привет. Это запрос, который я создал для извлечения записей из таблицы истории. Этот запрос работает нормально, но его выполнение занимает слишком много времени, поскольку он выбирает данные дважды из таблицы, а в таблице 20 записей или более.Поэтому я хочу оптимизировать это.Я постараюсь объяснить, что делает этот запрос и чего я хочу достичь.Я хочу выбрать две строки для каждого идентификатора (ActivityId) из таблицы, во-первых, где данные минимальны, а во-вторых, где максимальная дата, поэтому я могу видеть, сколько прогресса произошло за это время.Теперь, что я делаю, это сначала выбираю данные, где дата является минимальной как CTE, а затем выбираю данные, где дата является максимальной как CTE2.Я могу выбрать обе строки в одном CTE, но не могу получить одну запись из обеих строк.Как мне нужно только Progress и Planned Field из максимальной строки даты и выбрать все остальные поля (большинство полей являются общими для обеих строк).Так как я могу этого достичь.и, пожалуйста, попросите разъяснений при необходимости.
CTE:
WITH cte AS
(
SELECT Row_number() OVER (partition BY pmaph.activityid ORDER BY date) r1,
pma.planenddate AS planenddate ,
pma.planstartdate AS planstartdate,
pmaph.activityid,
pmaph.projectmilestoneactivproghist_id AS promileavtiid,
umd.uom_name AS uomname,
pmm.milestonename AS milestonename,
pma.activityname AS activityname ,
pmp.projectname AS projectname,
Replace((Rtrim(Ltrim(CONVERT(VARCHAR(12),Cast(pmaph.date AS DATETIME),106)))),' ','-') AS rdate,
Isnull(pmaph.actual_progress,0) AS actualprogress,
Isnull(pmaph.planned_progress,0) AS plannedprogress
FROM projectmilestoneactivityprogresshistory AS pmaph
LEFT JOIN dbo.pm_project AS pmp
ON pmaph.projectid=pmp.projectid
LEFT JOIN dbo.pm_activity AS pma
ON pmaph.activityid=pma.activityid
LEFT JOIN dbo.pm_milestone AS pmm
ON pmaph.milestoneid=pmm.milestoneid
LEFT JOIN dbo.uomdetail AS umd
ON pma.uom_id=umd.uom_id
WHERE pmaph.client_id=1030), cte2 AS( r2,isnull(pmaph.actual_progress,0) AS actualprogress, isnull(pmaph.planned_progress,0) AS plannedprogress, replace((rtrim(ltrim(CONVERT(varchar(12), cast(pmaph.date AS datetime),106)))),' ','-') AS rdate,pmaph.activityid FROM projectmilestoneactivityprogresshistory AS pmaph WHERE pmaph.client_id=1030)
SELECT cte2.rdate AS todate,
cte2.actualprogress AS end_actualprogress,
cte2.plannedprogress AS end_plannedprogress,
cte.actualprogress AS start_actualprogress,
cte.plannedprogress AS start_plannedprogress,
cte.rdate AS fromdate ,
cte.planenddate,
cte.planstartdate,
cte.activityid,
cte.uomname,
cte.milestonename,
cte.activityname,
cte.projectname
FROM cte
JOIN cte2
ON cte.activityid= cte2.activityid
WHERE cte.r1=1
AND cte2.r2=1