SQL HELP получает дубликаты при попытке получить max (Date) для записи

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

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)

person Kyle watford    schedule 15.08.2016    source источник
comment
Краткое объяснение этого заключается в том, что вы не можете вернуть все свои данные с максимальной датой за один проход. Вам нужен один проход, чтобы идентифицировать запись с этой датой, и второй проход, чтобы получить остальную часть записи. Выполнение этого другим способом возвращает ВСЕ уникальные записи. Что побеждает цель только Макса.   -  person durbnpoisn    schedule 15.08.2016
comment
Почему t.column1 во внутреннем выборе? T должен быть неизвестен   -  person xQbert    schedule 15.08.2016
comment
какая rdbms/база данных? sql-сервер оракула mysql? @durbnpoisn с оконными функциями, вы, безусловно, можете получить максимум набора данных без группировки или нескольких проходов, поэтому это зависит от того, какой rdbms используется. С учетом сказанного, если он пытается удалить дубликаты, то ключом будет выбор конкретной комбинации условий, которая вернет только 1 отдельную запись/информацию из таблицы2 pr   -  person Matt    schedule 15.08.2016
comment
Кайл, вам нужен последний ненулевой ответ › 2015-09-01 или последний ответ, если › 2015-09-01 и если ответ не нулевой и если столбец8 имеет значение. Разница незначительна, но фильтрация данных ответа перед соединением даст последнюю строку, соответствующую вашим критериям, даже если эта строка не является последней строкой, если она существует, а фильтрация после будет возвращать только последнюю строку, если она существует с этими условиями.   -  person Matt    schedule 15.08.2016
comment
t.[column1] — это задание №, и иногда мы получаем несколько ответов. Итак, моя цель - вернуть все задания # и связанный с ними последний ответ   -  person Kyle watford    schedule 15.08.2016
comment
SQL Server.. И ищем последний ответ, если › 2015-09-01 и если ответ не нулевой и если столбец8 имеет значение   -  person Kyle watford    schedule 15.08.2016


Ответы (1)


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)
person Matt    schedule 15.08.2016