2014-03-01 52 views
1

我正在使用一個簡單的存儲過程從數據庫中獲取一些數據,該數據庫迄今爲止工作正常。SQL Server:計算選擇結果中每個項目的外觀

在SQL中有沒有一種方法可以計算每個項目在我的選擇結果中出現的頻率,然後刪除重複項,例如看着「url」列? 基本上我想添加到我的選擇結果的每一行,然後理想地刪除重複項。

例如: 我未經過濾的結果是:url1,url1,url1,url2,url2,url3。 我想看到什麼,而不是則是: 爲url1 3 URL2 2 URL3 1

我的存儲過程:

**ALTER PROCEDURE [dbo].[CountQueue] 
AS 
BEGIN 
SET NOCOUNT ON; 
SELECT  dateEsc, 
      url, 
      EID 
FROM  QueueLog 
WHERE  logStatus = 'New' 
AND   region = 'US' 
AND   (
       flag = 'flag1' 
       OR 
       flag = 'flag2' 
      ) 
ORDER BY dateEsc desc, EID desc 
END** 

與此添

+0

根據你所描述的內容,我不明白爲什麼SELECT DISTINCT不起作用,但我懷疑你遺漏了你的問題,這說明了爲什麼這是不夠的。 –

回答

2

你任何幫助非常感謝可以在查詢中執行此操作,您不必使用存儲過程。如果我理解正確,可以使用「group by」來解決問題。

SELECT  url, 
      count(*) 
FROM  QueueLog 
WHERE  logStatus = 'New' 
AND   region = 'US' 
AND   (
      flag = 'flag1' 
      OR 
      flag = 'flag2' 
      ) 
GROUP BY url; 

如果你想只有那些重複的網址,你可以添加具有:

SELECT  url, 
      count(*) 
FROM  QueueLog 
WHERE  logStatus = 'New' 
AND   region = 'US' 
AND   (
      flag = 'flag1' 
      OR 
      flag = 'flag2' 
      ) 
GROUP BY url 
HAVING count(*) > 1; 

我刪除重複喜歡的方式涉及到使用windowing functions。無論哪種方式,要刪除重複項,您必須知道要刪除的重複項。我假設你想用新的dateEsc刪除那個。這個查詢(或類似的東西)應該會給你所有重複的行。在確認它們是正確的之後,將它從選擇改爲刪除並不難。

SELECT * FROM 
(
SELECT  EID, 
      dateEsc, 
      url, 
      rank() OVER(PARTITION BY url ORDER BY dateEsc) as rank 
FROM  QueueLog 
WHERE  logStatus = 'New' 
AND   region = 'US' 
AND   (
      flag = 'flag1' 
      OR 
      flag = 'flag2' 
      ) 
) a 
WHERE a.rank > 1; 

基本上,內部查詢將帶有相同url的所有行,併爲它們提供基於dateEsc的排名。因此,具有最早的dateEsc的人將在等級列中獲得「1」,下一個最老的人將獲得等級2,依此類推。然後我們知道我們想保留1級的副本 - 副本將是等級2或更高的任何東西。所以我們在外部查詢中選擇這些行。如果你想改變條目是「正確的」,只需將rank() OVER(PARTITION BY url ORDER BY dateEsc) as rank更改爲rank() OVER(PARTITION BY url ORDER BY EID) as rank 等。

+0

非常感謝 - 這真是太棒了,這些解釋對我有很大幫助! – user2571510