Unique-Constraint

以任意順序配對行值

  • September 8, 2019

我正在嘗試查找存在於兩列中的唯一對的百分比。例如

在此處輸入圖像描述

其中 1,6 和 6,1 / 2,3 和 3,2 是唯一對。所以匹配對的百分比是 33%

沒有多大意義:

  • 對的數量是6,–與問題無關……
  • 唯一置換對的數量是4 - 更相關……
  • 有 2 個匹配對,所以我將匹配對的唯一數量設為4/2,即50%

儘管存在上述反對意見,但您可以使用LEASTGREATEST(幾乎是標準的 - 參見下面的討論)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<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/245894