如何计算SQL中的所有组合事件?

obj*_*jah 6 sql postgresql combinations

是否有任何选项可以在不使用临时表或过程的情况下获取一个 SQL查询中所有元素的计数组合?

考虑这三个表:

  • 产品(id,product_name)

  • 交易(身份证明,日期)

  • transaction_has_product(id,product_id,transaction_id)

样本数据

结果应该是:

AAA, BBB = 2   
AAA, CCC = 1   
BBB, CCC = 1   
AAA, BBB, CCC = 1
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 1

这并不容易,因为与其他行相比,最后一行中的匹配产品数量不同。您也许可以使用某种 GROUP_CONCAT() 运算符(在 MySQL 中可用;可在其他 DBMS 中实现,例如 Informix 和可能的 PostgreSQL)来完成此操作,但我对此没有信心。

成对匹配

SELECT p1.product_name AS name1, p2.product_name AS name2, COUNT(*)
  FROM (SELECT p.product_name, h.transaction_id
          FROM products AS p
          JOIN transactions_has_products AS h ON h.product_id = p.product_id
       ) AS p1
  JOIN (SELECT p.product_name, h.transaction_id
          FROM products AS p
          JOIN transactions_has_products AS h ON h.product_id = p.product_id
       ) AS p2
    ON p1.transaction_id = p2.transaction_id
   AND p1.product_name   < p2.product_name
 GROUP BY p1.name, p2.name;
Run Code Online (Sandbox Code Playgroud)

处理三重匹配并非易事;进一步扩展它肯定是相当困难的。