用于避免多个GROUP BY

时间:2018-06-14 09:26:28

标签: sql postgresql recursion group-by

我有一个SQL查询(在PostgreSQL数据库上)递归遍历友谊表:

WITH RECURSIVE friendship(pID, distance, path) AS (
  (SELECT pID1, 1, CONCAT(getName(pID2), '->', getName(pID1)) 
FROM pkp_symmetric WHERE pID2 = 94)
UNION
  (SELECT sym.pID1, distance + 1, CONCAT(path, '->', getName(sym.pID2)) 
   FROM pkp_symmetric sym JOIN friendship f ON sym.pID2 = f.pID WHERE distance < 5)
   )
SELECT getName(f.pID), min(f.distance), f.path
FROM friendship f 
WHERE f.pID <> 94
GROUP BY f.pID;

getName(pID)只是一个帮助函数,可以打印出名称,而不是ID&#39}。 此查询将给出错误,因为f.path需要位于GROUP BY - 子句或聚合函数中(SQL状态:42803)。但是,如上所述,我需要按f.pID对此查询进行分组。 是否有一种解决方法可以将f.path引入select,但不对其进行分组? 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用distinct on

SELECT DISTINCT ON (f.pId) getName(f.pID), f.distance, f.path
FROM friendship f 
WHERE f.pID <> 94
ORDER BY f.pID, f.distance