2016-08-15 41 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)