Как самостоятельно вступить в CTE? - PullRequest
0 голосов
/ 17 декабря 2018

Привет. Это запрос, который я создал для извлечения записей из таблицы истории. Этот запрос работает нормально, но его выполнение занимает слишком много времени, поскольку он выбирает данные дважды из таблицы, а в таблице 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
...