1

我有一个r_event包含列的数据库表:

event_start (date), 
event_stop (date),
insurance_id (integer) 

和一个r_insurance带有列的表:

insurance_id serial primary key,
insurance_name (text)

每个保险都有几个由 链接的事件insurance_id

我正在尝试:
SELECT insurance_id, insurance_name- 每个只有 1 个,
并按最大 event_stop的顺序排列:
ORDER BY event_stop DESC NULLS LAST- ??

例子

r_insurance (insurance_id, insurance_name)
1 | rca
2 | casco
3 | itp

r_event (insurance_id, event_start, event_stop)
1 | 12.10.2012 | 27.11.2012
1 | 07.05.2012 | 24.06.2012
2 | 21.01.2013 | 14.02.2013

输出应该是:

1 | casco -- 因为它有最大 event_stop 的事件  
2 | rca -- 因为它在最大的 event_stop 之后有第一个 event_stop  
3 | itc——因为它没有事件

我编辑了我的初稿,我希望它们按最大的事件降序event_stop排列NULLS LAST

4

2 回答 2

2
SELECT i.insurance_id, i.insurance_name, max(e.event_stop) latest_stop
FROM   r_insurance i
LEFT   JOIN r_event e USING (insurance_id)
GROUP  BY 1, 2
ORDER  BY latest_stop DESC NULLS LAST;

LEFT JOIN对于避免丢失r_insurance没有相关行的行至关重要r_event-itc在您的示例中。
ORDER BY确实是DESC。另外,前面没有逗号NULLS LAST

在 PostgreSQL 9.1 中,主键覆盖了列表中表的所有非聚合列SELECT,因此您可以简化(更多细节在这里):

SELECT i.insurance_id, i.insurance_name, max(e.event_stop) latest_stop
FROM   r_insurance i
LEFT   JOIN r_event e USING (insurance_id)
GROUP  BY 1
ORDER  BY latest_stop DESC NULLS LAST;

sqlfiddle 上的演示。

于 2012-06-07T21:45:44.937 回答
1

“它可以用 GROUP BY 来完成,但我不太清楚它是做什么的以及如何做的”

Group by 采用关系并将其划分为具有相同值的所有行的分区。从那里,您将从结果关系中的每个分区中获得一行;聚合函数接管每个分区而不是整个分区。您可能可以制定如下内容:

SELECT
 insurance_id,
 insurance_name,
 max(stop) max_stop
FROM r_event JOIN r_insurance
 ON r_event.insurance_id = r_insurance.insurance_id
GROUP BY insurance_id, insurance_name
ORDER BY max_stop, NULLS LAST
于 2012-06-07T11:53:53.537 回答