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
我在这里有一个问题,我希望有一个简单的解决方案.我会尝试尽可能简单:
select * from tickets JOIN attendees ON attendee.id = tickets.attendee_id
Run Code Online (Sandbox Code Playgroud)
也就是说,我需要运行一个查询,返回有关票证的各种信息,包括总收入.问题是,如果2张门票属于同一位与会者,则会将其收入计入两次.如何仅将与会者收入相加一次?
我不想使用子查询,因为我的ORM使这很困难.如果我想为多列执行此操作,则子查询解决方案无法扩展.
这就是我所拥有的:
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
不确定这在 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)
并在每次插入数据时使用触发器更新它。