Unique-Constraint
以任意順序配對行值
我正在嘗試查找存在於兩列中的唯一對的百分比。例如
其中 1,6 和 6,1 / 2,3 和 3,2 是唯一對。所以匹配對的百分比是 33%
沒有多大意義:
- 對的數量是6,–與問題無關……
- 唯一置換對的數量是4 - 更相關……
- 有 2 個匹配對,所以我將匹配對的唯一數量設為4/2,即50% …
儘管存在上述反對意見,但您可以使用LEAST和GREATEST(幾乎是標準的 - 參見下面的討論)SQL 函式來做類似的事情。
這個例子(見fiddle)來自 PostgreSQL,但見最後的討論。
CREATE TABLE test (col1 INTEGER, col2 INTEGER);
填充您的數據:
INSERT INTO test VALUES (1, 6), (2,3), (3, 2), (4, 7), (5, 8), (6, 1);
第一個查詢:
SELECT LEAST(col1, col2) AS mn_c, GREATEST(col1, col2) AS mx_c, COUNT(*) FROM test GROUP BY 1, 2
結果:
mn_c mx_c count 2 3 2 4 7 1 1 6 2 5 8 1
然後:
SELECT COUNT(cnt1) AS matched_count, ROUND(COUNT(cnt1)/(SELECT COUNT(*) FROM test)::FLOAT * 100) AS percentage FROM ( SELECT LEAST(col1, col2) AS mn_c, GREATEST(col1, col2) AS mx_c, COUNT(*) AS cnt1 FROM test GROUP BY 1, 2 HAVING COUNT(*) > 1 ) AS t
結果:
matched_count percentage 2 33
上述程式碼的一個版本應該適用於大多數伺服器 - 請參閱此處以討論其他伺服器中的 LEAST 和 GREATEST 函式 - 幾乎適用於除 MS SQL Server 之外的所有伺服器。
ps您是否考慮過如果您有如下重複的列會發生什麼?
INSERT INTO test VALUES (1, 6), (2,3), (3, 2), (4, 7), (5, 8), (6, 1), (5,5), (5,5)
請注意重複的重複
(5,5)
- 請參閱此處了解我的方法與 @McNets 的方法之間出現的差異。我的解決方案說有 3/8 匹配對,但 McNets 說不同。不確定我是否完全理解他的 SQL 在做什麼?無論如何,有趣的問題 (+1) - 你為什麼要這樣做?ps 歡迎來到論壇!:-)
使用標準 SQL 可能是:
SELECT COUNT(*) * 100 / (SELECT COUNT(*) FROM t) FROM t t1 WHERE NOT EXISTS (SELECT 1 FROM t t2 WHERE t2.col1 = t1.col2 AND t2.col2 = t1.col1);
| 百分比 | | ------: | | 33 |
db<>在這裡擺弄