我想表达一下:
SELECT
a.*
,b.timestamp_col
FROM weird_data_source a
LEFT JOIN weird_data_source b
ON a.id = b.id
AND b.timestamp_col = (
SELECT
MAX(sub.timestamp_col)
FROM weird_data_source sub
WHERE sub.id = a.id
AND sub.date_col <= a.date_col
AND sub.timestamp_col < a.timestamp_col
)
这里有一些关于数据的说明:
date_col
和timestamp_col
不代表同一件事。但子查询无效。 Netezza无法处理相关子查询中的<
运算符。对于我的生活,我无法找到另一种选择。我怎么能绕过这个?
我的直觉告诉我这可能是通过加入完成的,但我还未能成功。
有十几个类似的问题,但似乎没有人能够处理这种不平等。
答案 0 :(得分:1)
这应该让你非常接近。如果有两行完全相同的timestamp_col
符合条件,那么您将获得重复的行,否则您应该是好的:
SELECT
a.id,
a.some_other_columns, -- Because we NEVER use SELECT *
b.timestamp_col
FROM
weird_data_source a
LEFT JOIN weird_data_source b ON
a.id = b.id
LEFT OUTER JOIN weird_data_source c ON
c.id = a.id AND
c.date_col <= a.date_col AND
c.timestamp_col < a.timestamp_col
LEFT OUTER JOIN weird_data_source d ON
d.id = a.id AND
d.date_col <= a.date_col AND
d.timestamp_col < a.timestamp_col AND
d.timestamp_col > c.timestamp_col
WHERE
d.id IS NULL
该查询基本上是在寻找一个匹配的行,其中没有找到其他匹配的行具有更大的timestamp_col
值 - 因此d.id IS NULL
。如果找不到匹配项,该列只会是NULL
。