同一记录中列的 DB2 Max Timestamp

Posted

技术标签:

【中文标题】同一记录中列的 DB2 Max Timestamp【英文标题】:DB2 Max Timestamp of columns in the same record 【发布时间】:2016-05-19 14:46:08 【问题描述】:

我在 DB2 中有 3 个表 A、B、C。他们是一对一的关系。 A为父表,B、C为子表。

每个表都有一个时间戳列,用于跟踪记录的更改。比如说 T1,T2,T3。

我想编写一个视图,每个键(比如 ID 列)获取 A、B、C 中的所有记录,以便我从所有三个表中获取一个逻辑记录。我知道我可以将 A 左外连接与 B 和 C 一起使用。除了带有选定列的逻辑记录,我还想要 max(T1,T2,T3)。它不是跨行的列的最大时间戳,而是在同一逻辑记录中。

我不喜欢写查询,因此需要帮助。

【问题讨论】:

【参考方案1】:

结合 GREATEST()VALUE() 将 NULL 更改为任意低时间戳:

SELECT a.id, 
GREATEST(
  VALUE( T1, TIMESTAMP  '1970-01-01 00:00:00'),
  VALUE( T2, TIMESTAMP  '1970-01-01 00:00:00'),
  VALUE( T3, TIMESTAMP  '1970-01-01 00:00:00')
)     
FROM a
LEFT OUTER JOIN b ON a.id = b.id
LEFT OUTER JOIN c ON a.id = c.id

【讨论】:

仍然是我为查尔斯的解决方案提到的同样的空问题。我有点这样做 max(COALESCE(T1, X), COALESCE(T2, X), COALESCE(T3, X)),其中 X 是 1970 TS。这有意义吗?或任何更短的形式可用? 讨厌的NULL 总是破坏乐趣:如果传递的任何值为空,标量函数将返回NULL【参考方案2】:

假设每个表中每个ID都有一条记录,那么:

select a.id, max(a.T1, b.T2, c.T3)
from tblA A
      join tblB B on b.id = a.id
      join tblC C on c.id = a.id

会给你你所要求的。 MAX() 只返回给定集合中的最大值。这个集合的来源由你决定。

不使用GROUP BYMAX() 仅具有结果集中每一行的一组值。

【讨论】:

我需要左外连接,所以尝试了“select a.id, max(a.T1, b.T2, c.T3) from tblA A left outer join tblB B on b.id = a.id left external join tblC C on c.id = a.id"...但是如果一个键存在于 A、B 但不存在于 C 中,则最大时间戳为空,但我希望 A 和 B 中的最大值 在 t2 上使用 coalesce(c.t3, 0) 可能需要相同。可能需要用有效的时间戳替换 0。 '0001-01-01 00;01:00.0000'

以上是关于同一记录中列的 DB2 Max Timestamp的主要内容,如果未能解决你的问题,请参考以下文章

cassandra中列的默认排序顺序?

报告pyspark数据框中列的前3个最大值[重复]

Toad 问题:Oracle 类型作为显示所有记录的表中列的数据类型

COUNT() 对表中列的影响

关于sybase的timestamp

是否有任何其他选项可以从表中获取总计数和同一查询中列的不同计数?