sql - 查找出现在多列中的项目数

标签 sql postgresql

假设一张 table

source_document_id BIGINT NOT NULL,
target_document_id BIGINT NOT NULL,
similarity DOUBLE NOT NULL,

如果我想确定 source_document_id 列中文档的出现频率,我的查询将运行如下:

select count(source_document_id) as c1, source_document_id from PROJECT_0622.SIMILARITY_RESULT group by source_document_id order by  c1 desc;

但考虑到文档 ID 可能出现在 source_document_id 或 target_document_id 列中,... 我如何找到任一列中出现 documentId 的频率?

例如, 这样考虑数据

source_document_id source_document_id similarity
1 2 0.8
1 3 0.8
1 4 0.7
4 5 0.8
4 8 0.75
9 4 0.9      
2 4 0.99

我想达到这样的结果

frequency in source/target doc id column, doc_id
5 4
3 1
2 2    
1 8    
1 3
1 9
1 10

这可能吗?谢谢

最佳答案

有可能将数据聚合两次会有更好的性能:

select id, sum(cnt) as n_docs
from ((select source_document_id as id, count(*) as cnt
       from similarity
       group by source_document_id
      ) union all
      (select target_document_id as id
       from similarity
       group by target_document_id
      )
     ) t
group by id;

如果性能是一个考虑因素,两种方法都值得尝试,尤其是当两列上都有索引时。

关于sql - 查找出现在多列中的项目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33725827/

相关文章:

mysql - 有效的 innodb_lock_wait_timeout 值检查

mysql - 如何使用 group by 进行 mysql 查询

ruby-on-rails - 在多个条件下有效地获取记录

mysql - 创建从 2 个表获取数据并拥有自己的行的 View

c# - 基于子串匹配长度的高效 SQL 桶排序

sql - LIMIT 基于 COUNT of DISTINCT `foreign_key` 到目前为止

sql - 使用 PostgreSQL 批量验证电话号码

sql - 通过多个参数和条件检测 SQL 孤岛

sql - 如何将字符串分成不同的列?

postgresql - SQLAlchemy 复合类型