【发布时间】:2011-04-15 22:12:00
【问题描述】:
查询
SELECT
ppc.personid,
ppc.category,
ppc.phonenumber,
ppc.createts
FROM
person_phone_contacts ppc
WHERE
CURRENT_TIMESTAMP BETWEEN ppc.createts AND ppc.endts
AND CURRENT_DATE BETWEEN ppc.effectivedate AND ppc.enddate
ORDER BY
ppc.personid, ppc.category, ppc.createts DESC
结果数据
3742 | Home | xxx-xxx-xxxx | 2009-09-09 11:59:00.357-04
3742 | Home | xxx-xxx-xxxx | 2009-08-04 20:13:17.161-04*
3742 | Mobile | xxx-xxx-xxxx | 2009-09-09 11:59:20.070-04
3742 | Mobile | xxx-xxx-xxxx | 2009-09-09 11:59:20.070-04*
3742 | Other | xxx-xxx-xxxx | 2009-08-04 20:13:17.161-04
*要丢弃的重复项。
所需数据
3742 | Home | xxx-xxx-xxxx | 2009-09-09 11:59:00.357-04
3742 | Mobile | xxx-xxx-xxxx | 2009-09-09 11:59:20.070-04
3742 | Other | xxx-xxx-xxxx | 2009-08-04 20:13:17.161-04
问题
使用最近的日期(即使同一个人的同一类别中的多个电话号码具有相同的日期),检索每个人每个类别的单个电话号码的最有效方法是什么?
可能的解决方案
使用DISTINCT ON (ppc.category) category 可以限制每个人的结果,但是如何将其单独应用于所有人?
约束
- PostgreSQL 8.3
- 没有存储函数或过程
谢谢!
【问题讨论】:
-
太糟糕了,你没有使用 8.4 w/窗口功能:-(
-
@Adam:是的,我希望我可以使用 8.4,但生产数据库是 8.3。
-
@Dave:那么小马的链接应该会有所帮助。那家伙不知道什么?
-
有升级的机会吗? v9 刚刚发布...数据集越小,时间越短。
标签: sql postgresql group-by distinct