2016-08-15 72 views
4

我希望做一个聪明的计数操作,因此,如果在列中的数据是相同的,那么它将被算作1SQL服务器计数数据有着不同的价值观

我的表是:

dbo.Messages 
(
    FromUserId INT, 
    ToUserId INT 
) 

数据:

INSERT dbo.Messages VALUES(1, 5), (2, 20), (5, 1), (1, 5); 

计数应返回2,因为(1,5)和(5,1)是我的算法相同。

如何在SQL Server TSQL中编写它?

在此先感谢。

回答

2

这工作得很好:

CREATE TABLE #Messages 
(
    FromUserId INT, 
    ToUserId INT 
); 

INSERT #Messages VALUES(1, 5), (2, 20), (5, 1), (1, 5); 

SELECT COUNT(*) 
FROM (
    SELECT M1.FromUserId, M1.ToUserId 
    FROM #Messages AS M1 
    EXCEPT 
    SELECT M2.ToUserId, M2.FromUserId 
    FROM #Messages AS M2 
    WHERE M2.ToUserId > M2.FromUserId 
) AS T; 

EXCEPT派生表将删除重复的内容,然后它只是计数所谓的独特价值。请记住,这里不需要DISTINCT关键字,EXCEPT可以删除所有关卡。从派生表

结果:

FromUserId ToUserId 
---------- -------- 
1   5   
2   20 

您可以检查此查询是如何在这里工作:https://data.stackexchange.com/stackoverflow/query/524634/counting-unique-values

2

解决这个问题的一种方法是使用原始表中不同的值对FromUserIdToUserId中的最小和最大值进行分组。由于SQL Server与MySQL不同,它没有LEASTGREATEST函数,所以我们可以使用CASE表达式。

SELECT CASE WHEN t.FromUserId < t.ToUserId THEN t.FromUserId ELSE t.ToUserId END, 
     CASE WHEN t.FromUserId < t.ToUserId THEN t.ToUserId ELSE t.FromUserId END, 
     COUNT(*) AS duplicateCount 
FROM 
(
    SELECT DISTINCT FromUserId, ToUserId 
    FROM dbo.Messages 
) t 
GROUP BY CASE WHEN t.FromUserId < t.ToUserId THEN t.FromUserId ELSE t.ToUserId END, 
     CASE WHEN t.FromUserId < t.ToUserId THEN t.ToUserId ELSE t.FromUserId END 
0

Demo here

select distinct t1.* 
from 
#temp t1 
join 
#temp t2 
on t1.FromUserId=t2.ToUserId 
and t1.ToUserId=t2.FromUserId 
+0

我不认为它符合A/C。如果你会删除计数并保持不同,它会带回1和5,这似乎是错误的。 1,5和5,1应视为相同。 –

+0

@EvaldasBuinauskas:用户要求计数,在这种情况下,它会返回2,您是否看到我做过的演示 – TheGameiswar

+0

。但恰巧它带来了2.编辑数据,你的查询不再工作。它会带来不正确的计数。 –

1

在SQL Server 2008和以后这应该工作:

SELECT distinct 
    (SELECT Min(v) FROM (VALUES (FromUserId), (ToUserId)) AS value(v)) as UserIdMin, 
    (SELECT Max(v) FROM (VALUES (FromUserId), (ToUserId)) AS value(v)) as UserIdMax 
FROM dbo.Messages 

中房到: SQL MAX of multiple columns?

+1

这是很好的答案。要添加一些东西,你不需要两个独立的子查询,并且可以使用'CROSS APPLY'来返回MIN和MAX值。以下是一个示例:https://data.stackexchange.com/stackoverflow/query/524750/counting-unique-values –