相关疑难解决方法(0)

使用 RECURSIVE 查询来选择最长的路径

WITH RECURSIVE我是PostgreSQL 的新手。我有一个相当标准的递归查询,它遵循邻接列表。如果我有,例如:

1 -> 2
2 -> 3
3 -> 4
3 -> 5
5 -> 6
Run Code Online (Sandbox Code Playgroud)

它产生:

1
1,2
1,2,3
1,2,3,4
1,2,3,5
1,2,3,5,6
Run Code Online (Sandbox Code Playgroud)

我想要的是:

1,2,3,4
1,2,3,5,6
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在 Postgres 中做到这一点。这似乎是“选择最长的路径”或“选择不包含在另一条路径中的路径”。我也许可以看到如何通过连接本身来做到这一点,但这似乎效率很低。

一个示例查询是:

WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
   SELECT g.id, g.link, g.data, 1, ARRAY[g.id], false
   FROM graph g
  UNION ALL
   SELECT g.id, g.link, g.data, sg.depth + 1, path || g.id, g.id = ANY(path)
   FROM graph g, search_graph sg
   WHERE g.id = sg.link AND NOT cycle …
Run Code Online (Sandbox Code Playgroud)

sql postgresql directed-graph recursive-query common-table-expression

7
推荐指数
1
解决办法
2181
查看次数

获取连接表列的不同总和

我在这里有一个问题,我希望有一个简单的解决方案.我会尝试尽可能简单:

  • 票证属于与会者
  • 例:

select * from tickets JOIN attendees ON attendee.id = tickets.attendee_id
Run Code Online (Sandbox Code Playgroud)
  • 与会者有一个名为"收入"的十进制列

也就是说,我需要运行一个查询,返回有关票证的各种信息,包括总收入.问题是,如果2张门票属于同一位与会者,则会将其收入计入两次.如何仅将与会者收入相加一次?

我不想使用子查询,因为我的ORM使这很困难.如果我想为多列执行此操作,则子查询解决方案无法扩展.

这就是我所拥有的:

  • 1位收入为100的与会者
  • 两张属于该与会者的门票

Select count(tickets.*) as tickets_count
     , sum(attendees.revenue) as atendees_revenue
from tickets LEFT OUTER JOIN attendees ON attendees.id = tickets.attendee_id;
Run Code Online (Sandbox Code Playgroud)

=>这告诉我这attendees_revenue是200.我希望它是100.因为数据库中有一个参与者,其现有的回报为100.我不希望参与者被重复计算.

如果可能,请告诉我.

sql postgresql aggregate-functions duplicate-removal window-functions

5
推荐指数
1
解决办法
6329
查看次数

在非唯一列上创建唯一索引

不确定这在 PostgreSQL 9.3+ 中是否可行,但我想在非唯一列上创建唯一索引。对于这样的表:

CREATE TABLE data (
  id SERIAL
  , day DATE
  , val NUMERIC
);
CREATE INDEX data_day_val_idx ON data (day, val); 
Run Code Online (Sandbox Code Playgroud)

我希望能够[快速]仅查询不同的日期。我知道我可以用来data_day_val_idx帮助执行不同的搜索,但如果不同值的数量大大少于索引覆盖中的行数,这似乎会增加额外的开销。就我而言,大约每 30 天就有 1 个是明显的。

创建关系表以仅跟踪唯一条目是我唯一的选择吗?思维:

CREATE TABLE days (
  day DATE PRIMARY KEY
);
Run Code Online (Sandbox Code Playgroud)

并在每次插入数据时使用触发器更新它。

sql postgresql unique-index postgresql-9.3

4
推荐指数
1
解决办法
9518
查看次数