在sql中计算顶点度数

时间:2014-03-19 12:27:50

标签: postgresql graph-theory

我有一张表格,它基本上将图表中的边缘表示为时间的函数(理想情况下,每个日期可以看作不同的图表,以及我如何看待它)。

它是这样的,fromNode和toNode的值具有相同的性质,并且它们可能会被重复(例如,节点可以在'来自'和'到& #39;同月):

 fromNode, toNode, date

现在,我想计算一个给定月份和一组节点的度数(将图表视为无向,因此没有进出度)。我可以这样做:

select count(*) from mytable where (fromNode = thisvalue or toNode = thisvalue) and date = thisdate;

并拥有一个节点的学位。

目前无法解决的问题是如何以一种对一组节点起作用的方式扩展它。预期的结果将是:

 node | degree
 -------------
 nodeA|  12
 nodeB|  0
 nodeC|  15
 ...

等等。提前谢谢。

(我正在使用postgresql,9.3)

2 个答案:

答案 0 :(得分:2)

假设您有一个表格,其中包含所有节点(nodeTable,其中包含一列node),而边缘表名为edgeTable,那么这将有效:

select 
node, 
(select count(*) from edgeTable 
        where (fromNode=node or toNode=node) and date=thisdate) degree 
from  nodeTable

如果您没有nodeTable这样的东西,可以使用

轻松构建它
select fromnode as node from edgeTable union select tonode as node from edgeTable
where date=thisdate

您可以将其用作子查询。

答案 1 :(得分:1)

尝试此查询:

SELECT AllNodes.node, 
       Count(*)
FROM (
   SELECT "fromNode" As node
   FROM Table1
   UNION
   SELECT "toNode"
   FROM Table1
) AllNodes
JOIN Table1  t1
ON AllNodes.node IN( t1."fromNode", t1."toNode")
-- WHERE t1.date between etc
GROUP BY AllNodes.node
ORDER BY AllNodes.node

演示 - > http://sqlfiddle.com/#!15/21faa/4