2014-12-30 44 views
0

我想創建一個查詢,它需要在子查詢上進行連接。不過,我還需要能夠通過主查詢的結果來限制子查詢的結果。在查詢(和子查詢)之間共享值

我修改了我以前的問題,以顯示我想運行的完整「概念」查詢。我知道它會充滿各種問題,但我缺乏足夠的經驗(當前)來修改足夠的語法來運行此查詢。下面

實施例:

SELECT 
    w.timestamp, 
    c.timestamp 
FROM 
    table1 w 
FULL OUTER JOIN 
    (SELECT 
      customer_id, 
      timestamp 
     FROM 
      table1 c 
     HAVING 
      c.timestamp < w.timestamp 
     AND 
      timestamp = MAX(c.timestamp)) c 
ON 
    w.customer_id = c.customer_id 
WHERE 
    payment_type_code='WithdrawPayment' 
AND 
    w.customer_id IN 
     (SELECT 
      customer_id, 
      timestamp 
     FROM 
      table1 
     WHERE 
      c.timestamp < w.timestamp 
     AND 
      timestamp = MAX(c.timestamp) 
    ORDER BY 
      c.timestamp DESC 
     ) 
HAVING 
    (SELECT 
     COUNT(*) 
    FROM 
     table1 u 
    WHERE 
     u.timestamp > c.timestamp 
    AND 
     u.timestamp < w.timestamp) u > 0 
; 

任何幫助,將不勝感激。

+0

範圍規則。只需將「c.timestamp jarlh

+0

因此我可以這樣寫:SELECT w.timestamp, c.timestamp FROM表1 W¯¯ FULL OUTER JOIN (SELECT CUSTOMER_ID, 時間戳 FROM表1 ç HAVING 時間戳= MAX(c.timestamp)) c ON w.customer_id Nic2352

+0

不確定這會對我有用,因爲我試圖加入customer_id,但只有在c.timestamp Nic2352

回答

0

正如其他人在評論中提到的那樣,您的查詢是完全有缺陷的:您無法同時訪問聚集數據和詳細數據,也無法關聯派生表中的查詢。

但你似乎去尋找一個table1中之前在表2中最大的時間戳,這可以這樣表示:

SELECT 
    w.timestamp, 
    c.timestamp 
FROM 
    table1 w 
LEFT JOIN 
    table1 c 
ON 
    w.customer_id = c.customer_id -- join on customer_id 
AND c.timestamp < w.timestamp  -- using only earlier timestamps 
WHERE 
    action_type ='type1' 
QUALIYF 
    RANK() 
    OVER (PARTITION BY w.customer_id -- assuming there's only one row per customer in w 
      ORDER BY c.timestamp DESC) = 1 -- find the maximum timestamp 
+0

我在上面的問題中修改了我的查詢。我知道它仍然充滿了問題,但正如我上面提到的,我沒有足夠的經驗或理解來修改它 – Nic2352

+0

我不明白你想達到什麼。您最好詳細解釋您的規則並添加DDL和示例數據。 'table1'實際上總是同一張表嗎? – dnoeth

0

您的查詢不是有效的SQL,它甚至還不清楚你是什麼試圖用它來實現。 (我必須承認我甚至沒有猜到你的查詢的目的。)你應該告訴我們查詢應該做什麼,而不是讓我們指出你的語法錯誤。

不管怎樣,讓我們​​開始您的派生表:

SELECT customer_id, timestamp 
FROM table1 c 
HAVING c.timestamp < w.timestamp 
AND timestamp = MAX(c.timestamp) 

您選擇table1的記錄(僅限於列CUSTOMER_ID和時間戳要準確)。您正在選擇所有行(沒有WHERE子句)。然後是一個HAVING子句。這在這裏是無效的。 HAVING子句在聚合值後工作,例如,如果您選擇MIN(customer_id)和MAX(時間戳)作爲一個記錄或每個組(使用GROUP BY)。因爲你的HAVING條款沒有任何意義,我真的不知道你是怎麼想到使用它的。

然後在HAVING子句中,將時間戳與MAX(timestamp)進行比較。你不能這樣做。聚合之前有一段時間,例如,您可以查看記錄及其時間戳列。然後聚集後有一段時間,你可以看MAX(時間戳)。你沒有看到他們在同一時間。爲此,您必須從同一個表中選擇兩次,一次查看單個記錄,一次查看聚合。如:

SELECT customer_id, timestamp 
FROM table1 c 
WHERE timestamp = (select MAX(timestamp) from table1) 

在這裏,我檢查每一條記錄,它的時間戳是否等於表的最大時間戳,只保留這些記錄。

此外,您正在訪問此處不可見的w.timestamp。您只能比較派生表查詢之外的時間戳:

FROM table1 w 
FULL OUTER JOIN 
(
    SELECT customer_id, timestamp 
    FROM table1 
    WHERE timestamp = (select MAX(timestamp) from table1) 
) c ON c.timestamp = w.timestamp 

最後您正在進行完整的外連接。爲什麼? X FULL OUTER JOIN Y保留Y中不可用的X記錄,反之亦然。但是,您選擇FROM table1 w,因此您可以從table1獲取所有記錄,並與table1的子集(您的派生表查詢)進行連接。所以不能有派生表中的記錄在table1中不匹配。因此,一個完整的外連接根本沒有意義。然後在你的查詢的WHERE子句中,你要求確定w.customer_id。如果外連接工作,你會得到記錄在哪裏w。customer_id爲空。您的WHERE子句將刪除這些。另外一個原因是你的完全外連接沒有意義。

還有什麼?那麼你問的是w.customer_id IN (SELECT customer_id, timestamp FROM ...)。這在語法上是錯誤的。單值w.customer_id永遠不能匹配值對customer_id, timestamp。您可以改用w.customer_id IN (SELECT customer_id FROM ...)

然後再次在您的主查詢中使用HAVING,雖然沒有完成聚合。

我認爲如果您練習非常基本的查詢,這將是一件好事。 WHERE查詢。帶有聚合的查詢,比如MAX。包含每個組的聚合的查詢(即使用GROUP BY)。具有聚合和HAVING子句的查詢。 WHERE子句的查詢 a HAVING子句...

至於您在此處的查詢:也許我上面所說的可以幫助您逐步構建它。如果沒有,請回來告訴我們你的查詢應該做什麼,然後我們會告訴你如何。