Не удается получить результат по максимальной дате

#tsql #max

#tsql #макс

Вопрос:

Я пытаюсь получить выделенный результат только по последней дате. Я впервые задаю здесь вопрос, поэтому заранее приношу извинения, если это непонятно. Спасибо

1

Используя следующий запрос

 SELECT 
MAX(A.Insp_Date) AS Last_Insp_Date
,A.Doc_ID
,A.Service_Call_ID
,A.Customer_ID
,A.Address_Code
,A.State
,A.Branch
,B.HydLoc
,B.FlwOutSz
,B.StaticPSI
,B.ResidualPSI
,B.PititPSI
,B.FlwGPM


FROM [dbo].[fofHydrntInspHdr] AS A
    LEFT OUTER JOIN [dbo].[fofHYD2800FlwTstRT] AS B
        ON A.Doc_ID = B.Doc_ID

WHERE A.Doc_ID > 0
AND A.Address_Code = 'GEN0021'        

GROUP BY
A.Doc_ID
,A.Service_Call_ID
,A.Customer_ID
,A.Address_Code
,A.State
,A.Branch
,B.HydLoc
,B.FlwOutSz
,B.StaticPSI
,B.ResidualPSI
,B.PititPSI
,B.FlwGPM
  

Я также пробовал использовать max doc_id, и это все еще не работает. Ценю любую помощь.

Ответ №1:

Другой вариант, который не должен требовать двух сканирований вашей таблицы, — это отфильтровать последнюю версию с помощью функции window:

 with r as
(
    SELECT 
    A.Insp_Date AS Last_Insp_Date
    ,A.Doc_ID
    ,A.Service_Call_ID
    ,A.Customer_ID
    ,A.Address_Code
    ,A.State
    ,A.Branch
    ,B.HydLoc
    ,B.FlwOutSz
    ,B.StaticPSI
    ,B.ResidualPSI
    ,B.PititPSI
    ,B.FlwGPM
    ,DENSE_RANK() OVER (ORDER BY A.Insp_Date DESC) AS r

    FROM [dbo].[fofHydrntInspHdr] AS A
        LEFT OUTER JOIN [dbo].[fofHYD2800FlwTstRT] AS B
            ON A.Doc_ID = B.Doc_ID

    WHERE A.Doc_ID > 0
    AND A.Address_Code = 'GEN0021'
)
SELECT  
    Insp_Date AS Last_Insp_Date
    ,Doc_ID
    ,Service_Call_ID
    ,Customer_ID
    ,Address_Code
    ,State
    ,Branch
    ,HydLoc
    ,FlwOutSz
    ,StaticPSI
    ,ResidualPSI
    ,PititPSI
    ,FlwGPM
FROM r
WHERE r = 1;
  

Кроме того, я бы посоветовал не переименовывать ваши таблицы с помощью A , B C и т.д., Поскольку они не относятся к таблице и затрудняют понимание запроса позже. В этом случае псевдонимы типа h и ft будут передавать, что одна таблица — это заголовки, а другая — тесты потока, одновременно уменьшая количество символов.

Также похоже, что в ваших результатах происходит какое-то плохое дублирование, что говорит о том, что либо ваш запрос не объединяется и не фильтруется надлежащим образом, либо ваши данные неаккуратны.

Комментарии:

1. Спасибо за ответ, это фактически вернуло не выделенные результаты точно так, как показано на изображении выше. Дублирование является результатом изменений данных, которые вы видите в правых столбцах, и да, это беспорядочно, но, к сожалению, эти данные генерируются реальными людьми.

2. О, прошу прощения, вам просто нужно добавить desc к порядку сортировки в dense_rank . Я обновил это выше.

3. И что касается дублирования, вы заметите, что первые 8 строк в вашем примере вопроса на самом деле являются теми же 4 продублированными строками. Это говорит о том, что либо данные находятся в таблице скоростей потока дважды (должны быть очищены), либо вам не хватает join критериев.