sql - 棘手的 SQL SELECT 语句

标签 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

...等等。

现在的任务是在给定日期的每个组中选择“当前”条目(它们的 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 专家可以帮助我找到将这些步骤放在一个语句中的解决方案,我将非常高兴。

谢谢!

最佳答案

以下将适用于 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

任何数据库都应该支持:

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

关于sql - 棘手的 SQL SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1231331/

相关文章:

c# - 返回 bool 值以在 C# 中处理的 sql 命令

mysql - for 循环语句在数据库中创建行

sql - TOAD 脚本中的变量

java - Java中的多线程导致表锁

sql - PostgreSQL 在子查询中引用外部查询

php - 距离计算未返回结果

sql - 如何将 Postgresql varchar 列复制到整数列

database - Dspace双重写入RDBMS和SOLR与并发

第一个值为 0 时的 SQL Server 平均值

java - 如何在 hibernate 中使用数据库系统日期