2016-08-15 54 views
1

需要一些幫助,這裏是我的SQL如下:我得到重複回來,它不會返回我的LastRespondedDate字段。任何幫助將不勝感激。SQL HELP獲取重複時試圖獲取最大(日期)記錄

SELECT t.[column1], 
     pr.[column1], 
     pr.[RespondedDttm], 
     t.[column2], 
     t.[column3], 
     t.[column4] 
FROM Table1 t LEFT JOIN 
(
    SELECT [t.column1], [pr.column2], [RespondedDttm], MAX([RespondedDttm]) AS LastRespondedDate 
    FROM Table2 pr 
    GROUP BY [column1], RespondedDttm, [pr.column3]) pr 
    ON (t.[column1] = pr.[column1]) 
WHERE t.[column8] IN (value) AND 
     (pr.[RespondedDttm] >= '2015-09-01') AND 
     (pr.[Response] IS NOT Null) 
+0

這個簡短的解釋是,你不能所有的數據與最大日期在一個回傳。您需要一次傳球才能確定該日期的記錄,並且需要第二次傳球才能恢復記錄的其餘部分。以另一種方式做它返回所有唯一的記錄。這隻會破壞Max的目的。 – durbnpoisn

+0

爲什麼在內部選擇t.column1? T應該是未知的 – xQbert

+0

什麼rdbms /數據庫? sql-server的oracle的MySQL?帶窗口函數的@durbnpoisn你當然可以獲得數據集的最大值,而不需要分組或多次傳遞,因此它取決於使用哪個rdbms。有了這個說法,如果他試圖消除重複,那麼關鍵將是選擇一個特定的條件組合,只會返回表1中的1個不同的記錄/信息pr – Matt

回答

0
SELECT 
    t.[column1], 
    pr.[RespondedDttm] as LastRespondedDate, 
    t.[column2], 
    t.[column3], 
    t.[column4] 
FROM 
    Table1 t 
    LEFT JOIN 
    (
     SELECT 
      t2.[Column1] 
      ,t2.[column2] 
      ,[RespondedDttm] 
      ,RowNum = ROW_NUMBER() OVER (PARTITION BY ColWithDups ORDER BY [RespondedDttm]) 
      ,WithTiesRowNum = RANK() OVER (PARTITION BY ORDER BY [RespondedDttm] DESC) 
     FROM 
      Table2 t2 
     WHERE 
      t2.[RespondedDttm] >= '2015-09-01' 
      AND t2.[Response] IS NOT Null 
    ) pr 
    ON (t.[column1] = pr.[column1]) 
    AND pr.RowNum = 1 
    --AND pr.WithTiesRowNum = 1 --use this line if you want ties 
WHERE 
    t.[column8] IN (value) 

,如果你只想要1行或RANK(),如果你想要的一切關係,您可以使用窗口函數和ROW_NUMBER。

如果你想要,我想你意見建議的細微差別的另一個方向:

SELECT 
    t.[column1], 
    pr.[RespondedDttm] as LastRespondedDate, 
    t.[column2], 
    t.[column3], 
    t.[column4] 
FROM 
    Table1 t 
    LEFT JOIN 
    (
     SELECT 
      t2.[Column1] 
      ,t2.[column2] 
      ,[RespondedDttm] 
      ,RowNum = ROW_NUMBER() OVER (PARTITION BY ColWithDups ORDER BY [RespondedDttm]) 
      ,WithTiesRowNum = RANK() OVER (PARTITION BY ORDER BY [RespondedDttm] DESC) 
     FROM 
      Table2 t2 
    ) pr 
    ON (t.[column1] = pr.[column1]) 
    AND pr.[RespondedDttm] >= '2015-09-01' 
    AND pr.[Response] IS NOT Null 
    AND pr.RowNum = 1 
    --AND pr.WithTiesRowNum = 1 --use this line if you want ties 
WHERE 
    t.[column8] IN (value)