2014-03-19 32 views
0

我有一個表格,它基本上代表了圖形中的邊緣作爲時間的函數(理想情況下,每個日期可以被看作是一個不同的圖表,這就是我所看到的)。在sql中計算頂點度

這件事情是這樣,在FROMNODE和toNode值是同一性質的,他們可能會被重複(如,一個節點可能是在「從」和「到」的同一個月):

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)

回答

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

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 

輕鬆地建立它,你可以使用它作爲一個子查詢。