sql выберите 3 столбца и выполните дедупликацию двух столбцов

У меня есть настройка задания, которая в настоящее время выбирает записи из таблицы, не содержащей уникального индекса. Я понимаю, что это можно решить, просто поместив индекс в таблицу и соответствующие столбцы, но в этом сценарии для целей тестирования мне нужно удалить индекс, а затем выполнить выбор, который также удалит дубликаты на основе 2 столбцов:

SELECT DISTINCT [author], [pubDate], [dateadded]
FROM [Feeds].[dbo].[socialPosts]
WHERE CAST(FLOOR(CAST(dateadded AS float)) AS datetime) > 
                               DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE() - 2), 0)  
AND CAST(FLOOR(CAST(dateadded AS float)) AS datetime) < 
                               DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)

Это выбирает все записи за день до этого, и я хочу дедуплицировать записи на основе автора и публикации. Это может быть пост-выбор или сделанный ранее, но идея состоит в том, чтобы выяснить, можно ли это сделать в рамках выбора.


person vbNewbie    schedule 09.07.2012    source источник
comment
Вы на самом деле сохраняете dateadded как значение с плавающей запятой? Почему не фактическое значение даты/времени? Кроме того, вы должны делать включающие диапазоны с нижней границей и исключительные диапазоны с верхней границей (бит > - 2 сбивается). Какая связь между dateadded и другими столбцами - можно ли использовать простой MAX()?   -  person Clockwork-Muse    schedule 10.07.2012
comment
dateadded фактически хранится как datetime... не был уверен в другом способе заставить его работать... dateadded - это дата для конкретной записи, и мне просто нужно получить общее количество записей за предыдущий день   -  person vbNewbie    schedule 10.07.2012
comment
Вам не нужно ничего делать с вашими сохраненными данными — они уже «правильные». Прекратите кастинг (который не может вам помочь). Я не уверен, что это полностью «безопасно». Ваша верхняя граница должна быть в порядке как есть. Ваша нижняя граница должна быть изменена на dateadded >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 1, 0).   -  person Clockwork-Muse    schedule 10.07.2012


Ответы (1)


Вы можете использовать GROUP BY и любую агрегатную функцию в столбце dateadded для получения уникальных результатов author, pubdate.

SELECT  [author]
        ,[pubDate]
        ,MAX([dateadded])
 FROM   [Feeds].[dbo].[socialPosts]
 WHERE  CAST(FLOOR(CAST(dateadded AS float)) AS datetime) >  dateadd(day,datediff(day, 0, getdate()-2), 0)  
        AND CAST(FLOOR(CAST(dateadded AS float)) AS datetime) < dateadd(day,datediff(day, 0, getDate()), 0)
 GROUP BY 
        [author]
        , [pubdate]
person Lieven Keersmaekers    schedule 09.07.2012