Postgresql:在select中生成增量ID

Postgresql:在select中生成增量ID,sql,postgresql,postgis,Sql,Postgresql,Postgis,我有一个表格(用户、日期、从、到)。对于我的路由定义,所有带有键(user,day)的条目都在一个路由中。我想为每条路线创建一个id,以便 参赛作品 (0001,1970/01/01,A,B),(0001,1970/01/01,B,C),(0001,1970/01/01,C,D) 变成 (0001,1970/01/01,A,B,1),(0001,1970/01/01,B,C,1),(0001,1970/01/01,C,D,1) 当 (0002,1970/01/01,A,B) 将变成

我有一个表格(用户、日期、从、到)。对于我的路由定义,所有带有键(user,day)的条目都在一个路由中。我想为每条路线创建一个id,以便

参赛作品

(0001,1970/01/01,A,B),(0001,1970/01/01,B,C),(0001,1970/01/01,C,D) 
变成

(0001,1970/01/01,A,B,1),(0001,1970/01/01,B,C,1),(0001,1970/01/01,C,D,1) 

(0002,1970/01/01,A,B) 
将变成

(0002,1970/01/01,A,B,2) 

因为它是由不同的用户创建的。

最简单的解决方案是在子查询中使用窗口函数来获取每对用户+日期的id,然后将其加入

SELECT
  r.ruser
  ,r.rdate
  ,r.rfrom
  ,r.rto
  ,q.row_n
FROM
  routes AS r
  JOIN (SELECT DISTINCT
          r.ruser
          ,r.rdate         
          ,dense_rank() OVER (ORDER BY r.ruser ,r.rdate) AS row_n
        FROM
          routes AS r       
      ) AS q
    ON q.ruser = r.ruser AND q.rdate = r.rdate
ORDER BY
  r.ruser
  ,r.rdate

类似的内容请参见以下内容:如何区分不同路线的步骤?如果没有路线id,您能确保没有两条路线通过同一点吗?我怀疑,那不是我的问题。我有我的用户,通过n点。我只需要跟踪每个用户的路由并确定其路径。因此,每个“用户”只有一条路由。很高兴知道。(那么,
id
在第二个模式中是多余的。)思考这个问题的更广泛应用:是否真的不可能保留这些步骤的时间戳/计数器?因为即使没有它们,在数学上也是可能的,但要复杂一点。在这里使用稠密的_秩()是个好主意。不过,自联接不是必需的。简单的查询就足够了:.@tomasziorek我知道这应该是可能的,但我就是不能让它工作。请将其作为一个单独的答案发布,我将向您投票。或者您可以编辑您的查询,以便我可以向上投票以使用dense_rank();)