SQL Server:统计选择结果中每个项目的出现次数



我使用一个简单的存储过程从数据库中提取一些数据,到目前为止,这个过程运行良好。

SQL中有没有一种方法可以让我计算每个项目出现在我的选择结果中的频率,然后删除重复项,例如查看列"url"?基本上,我想添加到我选择的结果的每一行,然后理想地删除重复项。

示例:我未经过滤的结果是:url1,url1,url2,url2,url3。我希望看到的是:url1 3url2url3 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**

非常感谢您对Tim 的任何帮助

您可以在查询中执行此操作,而不必使用存储过程。如果我理解正确,你可以用"分组方式"来解决问题。

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

如果你只想得到有重复的url,你可以添加一个有:

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

我最喜欢的删除重复项的方法是使用窗口函数。无论哪种方式,要删除重复项,您必须知道要删除哪个重复项。我假设你想删除日期较新的Esc。这里的这个查询(或类似的查询)应该会提供所有重复的行。在您验证了它们是正确的之后,不难将其从选择更改为删除。

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的排名。因此,日期为Esc的最老的一个将在排名列中获得"1",下一个最老的将获得排名2,依此类推。然后我们知道我们希望保留排名为1的一个——重复的将是排名为2或更高的任何内容。因此,我们在外部查询中选择这些行。如果要将条目更改为"正确的条目",只需将rank() OVER(PARTITION BY url ORDER BY dateEsc) as rank更改为rank() OVER(PARTITION BY url ORDER BY EID) as rank或诸如此类。

最新更新