2012-07-09 63 views
1

我有一個工作設置,當前從不包含唯一索引的表中選擇記錄。我意識到這可以通過在表格和相關列上放置索引來解決,但在這種情況下,爲了測試目的,我需要刪除索引,然後執行一個選擇,同時刪除基於2列的重複項:sql在兩列上選擇3列和重複數據刪除

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) 

這將選擇前一天的所有記錄,我希望根據作者和pubdate重複記錄這些記錄。這可能是一個後期選擇或之前完成,但想法是找出是否可以在選擇內完成。

+0

您實際上是否將'dateadded'存儲爲_float_值?爲什麼不是實際的日期/時間戳值?此外,你應該做下限包容,上限排他的範圍('> - 2'位是offputting)。 'dateadded'和其他列之間的關係如何?可以使用簡單的MAX()嗎? – 2012-07-09 21:09:25

+0

dateadded實際上被存儲爲日期時間...不能確定任何其他方式來使其工作... dateadded是特定記錄的日期,我只需要獲得前一天的總記錄 – vbNewbie 2012-07-10 12:42:14

+0

你不應該需要對存儲的數據做任何事情 - 它已經是「正確的」。離開鑄件(這不能幫助你)。我不確定它是完全'安全'的。你的上限應該沒問題。你的下界應該改爲'dateadded> = DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()) - 1,0)'。 – 2012-07-10 15:37:02

回答

1

您可以使用GROUP BYdateadded列上的任何聚合函數來獲得唯一的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] 
+0

非常感謝。 – vbNewbie 2012-07-10 14:34:58