2016-08-15 3 views
1

Нужна помощь, вот мой SQL ниже: Я получаю дубликаты и не верну мое поле LastRespondedDate. Любая помощь будет принята с благодарностью.SQL HELP Получение дубликатов при попытке получить max (Date) для записи

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

Краткое объяснение этого состоит в том, что вы не можете вернуть все ваши данные с максимальной датой в один проход , Вам нужно пройти один проход, чтобы идентифицировать запись с этой датой, и второй проход, чтобы получить оставшуюся часть записи. Выполнение этого по-другому возвращает ВСЕ уникальные записи. Что поражает цель только Макс. – durbnpoisn

+0

Почему t.column1 во внутреннем выборе? T должно быть неизвестно – xQbert

+0

что rdbms/database? sql-server oracle mysql? @durbnpoisn с функциями окна вы можете получить максимальный набор данных без группы или несколькими проходами, поэтому он зависит от того, какой rdbms используется. С учетом сказанного, если он пытается уничтожить дубликаты, тогда ключевым будет выбрать конкретную комбинацию условий, которые будут возвращать только одну отдельную запись/информацию из таблицы2 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) 

Вы можете использовать оконные функции и ROW_NUMBER, если вы хотите только 1 строку или RANK(), если вы хотите, чтобы все связи.

В случае, если вы хотите другое направление нюанс, который я думаю, что вы комментарий предлагает:

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)