SQL Server使用不同的值计算2列中的数据

时间:2016-08-15 11:07:57

标签: sql-server tsql

我想进行智能计数操作,这样如果列中的数据相同,那么它将被计为1。

我的表是:

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中编写它?

提前致谢。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 :(得分: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?

答案 3 :(得分:0)

Demo here

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