我正在处理这个question 我知道简单的汇总答案,但我想尽办法用子查询来挑战自己。
SELECT outercm.surname, outercm.firstname, outercm.memid, subq.starttime
FROM cd.members outercm,
(
SELECT cm.memid, cb.starttime
from cd.members cm
JOIN cd.bookings cb ON cb.memid = cm.memid
WHERE cm.memid = outercm.memid
AND
DATE(starttime ) >= '01-09-2012'
ORDER BY cb.starttime
LIMIT 1
) as subq
我收到此错误:
有一个用于表“ outercm”的条目,但是不能被引用 从查询的这一部分开始。
我还尝试了FROM的子查询:
SELECT outercm.surname, outercm.firstname, outercm.memid,
(
SELECT cb.starttime
from cd.members cm
JOIN cd.bookings cb ON cb.memid = cm.memid
WHERE cm.memid = outercm.memid
AND
DATE(starttime ) >= '01-09-2012'
ORDER BY cb.starttime
LIMIT 1
)
FROM cd.members outercm
我收到此消息:
java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1
我不确定,何时以及如何在内部和外部查询之间引用。 感谢您的帮助
答案 0 :(得分:1)
在Postgres中,DISTINCT ON
可用于获取每组最高/最低行的结果,在您的示例中为“首次预订”。与GROUP BY
+ MIN()
之类的其他选项相比,或在相关子查询中使用LIMIT
时,这通常效率很高。
SELECT DISTINCT ON ( cm.memid ) cm.surname,
--get the first among memid
cm.firstname,
cm.memid,
cb.starttime
FROM cd.members cm
join cd.bookings cb
ON cb.memid = cm.memid
AND cb.starttime >= TIMESTAMP '2012-09-01'
ORDER BY cm.memid, --for each memid
cb.starttime; --that has the earliest date