0

我有一个看起来像这样的表(我们称之为 tableA):

    id    |   dateA    |   dateB    
----------|------------|-------------
    1     | 2011-01-01 | 2010-05-01
    1     | 2011-05-01 | 2010-06-12
    2     | 2011-01-11 | 2010-01-31
    2     | 2011-01-31 | 2010-02-01
    3     | 2011-05-11 | 2010-08-02
    3     | 2011-08-02 | 2010-09-10

我的目标是按 id 对行进行分组,并获得 dateA 的最小值和 dateB 的最大值,并得到一个看起来像这样的表:

    id    | min(dateA) | max(dateB)
----------|------------|-------------
    1     | 2011-01-01 | 2010-06-12
    2     | 2011-01-11 | 2010-02-01
    3     | 2011-05-11 | 2010-09-11

现在,我正在使用 LEFT join 方法:

SELECT
    id,
    tableB.dateA,
    tableC.dateB
FROM tableA as a

    LEFT JOIN (
        SELECT id, min(dateA)
        FROM tableA
        GROUP BY id
    )tableB ON a.id = tableB.id

    LEFT JOIN (
        SELECT id, max(dateB)
        FROM tableA
        GROUP BY id
    )tableC ON a.id = tableC.id

但是,我的方法太慢了。我有很大的桌子,大约需要 7 秒才能得到想要的结果。

谁能建议我一种适用于我的情况的良好优化技术?

谢谢你。

Ĵ

4

1 回答 1

2

一个简单的 GROUP BY 使用一次遍历表并且没有自联接有什么问题?

SELECT id, MIN(dateA), MAX(dateB)
  FROM TableA
 GROUP BY id;
于 2012-04-22T22:54:49.633 回答