【发布时间】:2010-11-16 21:49:56
【问题描述】:
在我的项目中选择数据时遇到性能问题。
有一个表有 3 列:“id”、“time”和“group”
- ID 像往常一样只是唯一的 ID。
- 时间为条目的创建日期。
- 该小组在那里将某些条目累积在一起。
所以表格数据可能是这样的:
ID | TIME | GROUP
------------------------
1 | 20090805 | A
2 | 20090804 | A
3 | 20090804 | B
4 | 20090805 | B
5 | 20090803 | A
6 | 20090802 | B
...等等。
现在的任务是在给定日期的每个组中选择“当前”条目(它们的 ID)。也就是说,为每个组找到给定日期的最新条目。
以下前提条件适用:
- 我事先不知道不同的群体 - 可能会有很多不同的群体随着时间的推移而变化
- 选择日期可能位于表中条目的日期“之间”。然后我必须在每组中找到最接近的一个。也就是说,TIME 小于选择日期,但在组中适用此规则的日期中的最大值。
我目前所做的是一个多步骤过程,我想将其更改为单个 SELECT 语句:
-
SELECT DISTINCT group FROM table查找可用组 - 对于 1) 中找到的每个组,
SELECT * FROM table WHERE time<selectionDate AND group=loop ORDER BY time DESC - 取 2) 中找到的每个结果的第一行
显然这不是最优的。
因此,如果一些更有经验的 SQL 专家可以帮助我找到将这些步骤放在一个语句中的解决方案,我将非常高兴。
谢谢!
【问题讨论】:
-
您使用的是什么数据库?更高级的功能差异很大。
-
TIME、TABLE和GROUP是保留的 SQL 关键字,因此,我发现它们作为 SQL 对象(如表和列)的名称有点误导。 -
首先,非常感谢迄今为止快速而出色的答案。我真的忘记了一些细节:我正在使用 ORACLE,但最好该解决方案也适用于 Postgresql。是的,这些名称确实会误导关键字 - 抱歉。
标签: sql database oracle postgresql plsql