我想进行智能计数操作,这样如果列中的数据相同,那么它将被计为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中编写它?
提前致谢。
答案 0 :(得分:2)
解决此问题的一种方法是使用原始表格中的不同值,按FromUserId
和ToUserId
中的最小和最大值进行分组。由于SQL Server与MySQL不同,它没有LEAST
和GREATEST
函数,因此我们可以使用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
答案 3 :(得分:0)
select distinct t1.*
from
#temp t1
join
#temp t2
on t1.FromUserId=t2.ToUserId
and t1.ToUserId=t2.FromUserId