棘手的SQL SELECT语句

Tho*_*zer 2 sql database oracle postgresql plsql

在项目中选择数据时出现性能问题.

有一个包含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
Run Code Online (Sandbox Code Playgroud)

...等等.

现在的任务是在给定日期的每个组中选择"当前"条目(它们的ID).也就是说,对于每个组,查找给定日期的最新条目.

以下前提条件适用:

  • 我事先并不知道不同的群体 - 可能会有许多不同的群体随着时间而变化
  • 选择日期可以位于表格中条目的日期之间.然后我必须找到每组中最接近的一个.也就是说,TIME小于选择日期,但是该规则适用于组的最大值.

我目前所做的是一个多步骤过程,我想将其转换为单个SELECT语句:

  1. SELECT DISTINCT group FROM table 找到可用的组
  2. 对于1)中找到的每个组, SELECT * FROM table WHERE time<selectionDate AND group=loop ORDER BY time DESC
  3. 取2)中找到的每个结果的第一行

显然这不是最佳的.

如果一些更有经验的SQL专家可以帮助我找到将这些步骤放在一个语句中的解决方案,我将非常高兴.

谢谢!

OMG*_*ies 10

以下内容适用于SQL Server 2005+和Oracle 9i +:

WITH groups AS (
       SELECT t.group,
              MAX(t.time) 'maxtime'
         FROM TABLE t
     GROUP BY t.group)
SELECT t.id,
       t.time,
       t.group
  FROM TABLE t
  JOIN groups g ON g.group = t.group AND g.maxtime = t.time
Run Code Online (Sandbox Code Playgroud)

任何数据库应该支持:

SELECT t.id,
       t.time,
       t.group
  FROM TABLE t
  JOIN (SELECT t.group,
               MAX(t.time) 'maxtime'
          FROM TABLE t
      GROUP BY t.group) g ON g.group = t.group AND g.maxtime = t.time
Run Code Online (Sandbox Code Playgroud)


Mar*_*som 5

以下是我在SQL Server中的操作方法:

SELECT * FROM table WHERE id in
(SELECT top 1 id FROM table WHERE time<selectionDate GROUP BY [group] ORDER BY [time])
Run Code Online (Sandbox Code Playgroud)