2016-02-17 66 views
1

我想表達的是:變換相關子查詢轉換爲連接

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 
    ) 

一對夫婦在這裏指出有關數據:

  1. date_coltimestamp_col代表的不是一回事。
  2. 我不是在開玩笑...數據的結構是這樣的。

但子查詢無效。 Netezza無法處理相關子查詢中的<運算符。對於我的生活,我無法找出一個替代方案。我怎麼能解決這個問題?

我的直覺告訴我,這可能可以通過加入來完成,但我還沒有成功。

有十幾個類似的問題,但他們似乎都沒有處理這種不平等。

+0

在netezza平臺上可以使用橫向連接嗎? –

+0

你可以在netezza中使用CTE和Row_Number()函數嗎? –

+0

@GiorgosBetsos,no::( – charles

回答

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

+0

只是一個簡單的問題,第一個左連接後的'和'是否出錯? – charles

+0

是的,這是一個複製/粘貼錯誤。我會更正它,謝謝 –

+1

接受這一點,因爲重複應該能夠通過'select distinct'來處理,'select *'在輸入問題時只是節省了空間;) – charles

相關問題