替换db2中的max()函数

时间:2018-02-20 14:25:09

标签: sql db2 max

我在DB2中执行复杂查询,其响应时间非常长。经过大量的研发后,我发现重复使用max()函数会导致执行时间受到阻碍。 因此,我想知道max()函数是否有替代方法。我读了一下关于rank()的内容,并想知道是否可以使用它,但是无法得到我想要的结果。

我的查询的一部分是:

   Select DISTINCT
   (Select MAX(DATE(last_timestamp)) from Table_1 where ID = E.EID)
   From Table_2 E 

我现在被困在这里太久了。所以任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:0)

row_number()优于rank(),因为您不需要重复项。这里是。我很感谢这个网站作为参考:https://www.ibm.com/developerworks/community/blogs/SQLTips4DB2LUW/entry/finding_the_maximum_row_and_more56?lang=en

SELECT DISTINCT last_timestamp 
  FROM (SELECT ROW_NUMBER() OVER(PARTITION BY A.ID ORDER BY A.last_timestamp DESC) AS rn, DATE(A.last_timestamp) as last_timestamp
         FROM Table_1 A, From Table_2 E where A.ID = E.EID) 
  WHERE rn = 1;   

语法可能不准确,因为我没有测试它并且我没有安装DB2。

答案 1 :(得分:0)

问题可能是将时间戳转换为日期--DATE() - 在执行MAX()函数之前 - 不是DB2专家,但是猜测这可能会最终创建一个日期的临时表,然后MAXed,并且不使用索引......

建议尝试以下方法:

{{1}}

当然,查询优化器可能足够聪明,可以做到这一点......

答案 2 :(得分:0)

也许您可以加入以下CTE:

WITH t1(i,t) AS 
( SELECT id, MAX(last_timestamp)
  FROM Table_1 
  GROUP BY id ) 
SELECT 
   ...
   DATE(t1.t),
   ... 
FROM Table_2
LEFT JOIN t1 ON Table_2.EID = t1.i