2016-08-15 40 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 –