2015-01-31 4 views
0

В следующем запросе мне нужно взять только одну запись, которая является последней версией phdate.Получить записи, основанные на последней дате

WITH TEMP_PAT_PIP_AddedBy 
AS (
    SELECT S.ppId 
     ,(
      SELECT PersonID 
      FROM [PFMADestination].[dbo].PERSON 
      WHERE SourceType = 'user_Users' 
       AND SourceId = S.uuId 
      ) AS AddedByToStore 
     ,phDate 
    FROM [PFMADestination].[dbo].PatientPIP D 
    INNER JOIN [PFMAOldProd].[dbo].pat_History S ON S.ppId = D.PatientId 
     AND phEvent = 'PIP-info uppdaterad' 
    ) 
--select * from TEMP_PAT_PIP_AddedBy order by ppId, phDate desc 
UPDATE P 
SET AddedBy = ISNULL(AddedByToStore, 1), Date=phDate 
FROM TEMP_PAT_PIP_AddedBy T 
INNER JOIN [PFMADestination].[dbo].[PatientPIP] P ON T.ppId = P.PatientId 

Ожидаемый результат для КТР Возьмите только последнюю phDate для каждого PPID и игнорировать другие, если его более чем 1 запись затем обновить его.

enter image description here

+0

... где phDate = (выберите max (phDate) из TEMP_PAT_PIP_AddedBy, где ppId = TEMP_PAT_PIP_AddedBy.ppId) – jarlh

+0

@jarlh, я хочу внести это изменение в сам CTE. Является ли это возможным? – Billa

ответ

1

Использование раздела, пункта вы можете получить ожидаемый выход. Попробуйте выполнить запрос:

WITH TEMP_PAT_PIP_AddedBy 
AS (
    SELECT S.ppId 
     ,(
      SELECT PersonID 
      FROM [PFMADestination].[dbo].PERSON 
      WHERE SourceType = 'user_Users' 
       AND SourceId = S.uuId 
      ) AS AddedByToStore 
     ,phDate , ROW_NUMBER() OVER(PARTITION BY S.ppId ORDER BY phDate DESC) AS NUM 
    FROM [PFMADestination].[dbo].PatientPIP D 
    INNER JOIN [PFMAOldProd].[dbo].pat_History S ON S.ppId = D.PatientId 
     AND phEvent = 'PIP-info uppdaterad' 
    ) 

UPDATE P 
SET AddedBy = ISNULL(AddedByToStore, 1), Date=phDate 
FROM TEMP_PAT_PIP_AddedBy T 
INNER JOIN [PFMADestination].[dbo].[PatientPIP] P 
ON T.ppId = P.PatientId AND T.NUM=1 
+0

Могу ли я сделать это сам CTE? – Billa

+0

Да, в этом случае вам нужно применить фильтр Num = 1 в CTE. –

+0

Я обновил свой вопрос с фактической потребностью. CTE будет использоваться в заявлении об обновлении – Billa

1

Добавить phDate = максимальное условие phDate к где п:

WITH TEMP_PAT_PIP_AddedBy 
AS (
    SELECT S.ppId 
     ,(
      SELECT PersonID 
      FROM [PFMADestination].[dbo].PERSON 
      WHERE SourceType = 'user_Users' 
       AND SourceId = S.uuId 
      ) AS AddedByToStore 
     ,phDate 
    FROM [PFMADestination].[dbo].PatientPIP D 
    INNER JOIN [PFMAOldProd].[dbo].pat_History S ON S.ppId = D.PatientId 
     AND phEvent = 'PIP-info uppdaterad' 
    ) 
SELECT * 
FROM TEMP_PAT_PIP_AddedBy 
where phDate = (select max(phDate) from TEMP_PAT_PIP_AddedBy 
       where ppId = TEMP_PAT_PIP_AddedBy.ppId) 
ORDER BY ppId 
    ,phDate DESC 

отредактированной версии, является phDate столбец P? (Если нет, отредактируйте мой ответ.)

WITH TEMP_PAT_PIP_AddedBy 
    AS (
     SELECT S.ppId 
      ,(
       SELECT PersonID 
       FROM [PFMADestination].[dbo].PERSON 
       WHERE SourceType = 'user_Users' 
        AND SourceId = S.uuId 
       ) AS AddedByToStore 
      ,phDate 
     FROM [PFMADestination].[dbo].PatientPIP D 
     INNER JOIN [PFMAOldProd].[dbo].pat_History S ON S.ppId = D.PatientId 
      AND phEvent = 'PIP-info uppdaterad' 
      AND phDate = (select max(phDate) from P 
          where ppId = P.ppId) 
     ) 
    --select * from TEMP_PAT_PIP_AddedBy order by ppId, phDate desc 
    UPDATE P 
    SET AddedBy = ISNULL(AddedByToStore, 1), Date=phDate 
    FROM TEMP_PAT_PIP_AddedBy T 
    INNER JOIN [PFMADestination].[dbo].[PatientPIP] P ON T.ppId = P.PatientId 

Svensk?

+0

Я обновил свой вопрос с настоятельной необходимостью. CTE будет использоваться в заявлении об обновлении – Billa

+0

@Billa, теперь добавили еще один запрос, который может вам помочь. – jarlh

Смежные вопросы