2017-05-25 23 views
0

值我有一個SQL查詢類似如下:如何從另一行獲得SQL

select 

    ,c.customer_leg1 
,d.mid 
     ,c.previous_customer_leg1 
     ,c.creation_date 
    ,c.end_date 
    ,c.cid 

    from table1 c 

    JOIN table2 d 
    ON c.cid = d.cid 
    where c.cid = '1234' 

這給下面的輸出:

customer_leg1 | previous_customer_leg1 | creation_data | end_date | cid 
4092   | 1888     | 05/06/17  | 05/07/17 | 735 
8915   | 4092     | 05/06/17  | 05/08/17 | 735 

我想添加一個新列,使得對於每個customer_leg1,我們發現在previous_customer_leg1中應該將該行的"end_date"放在該列中。

對於例如:在上面的輸出的第1行是customer_leg14092,這在第2行中發現previous_customer_leg1,所以在第1行,這new_column應該有它05/08/17。對於那些customer_leg1在previous_customer_leg1中不匹配的應用程序,它應該爲NULL。我想我可能會使用分區和滯後功能,但我對這些並不十分清楚。任何幫助將不勝感激。謝謝!

+0

你根本沒有關閉。爲什麼你認爲你需要'lag()'和'partition'?你需要的是自我加入,而不是分析功能。最好只說出你的問題(就像你一樣);不包括如何在你的問題陳述中解決它。 (你沒有,你只是給你的印象你給的標題。) – mathguy

+0

你發佈的查詢沒有太大意義。你選擇的所有列都來自'table1','where'條件也都是基於同一個表,爲什麼你加入'table2'? – mathguy

+0

,因爲實際的查詢真的很大,這只是我想要的東西 – Arman

回答

0

由於您只顯示你想要什麼「要點」中,一個可能的解決方案可能是「要點」是這樣的:

添加到您的「真正的巨大的」查詢另一個加盟:

select ..... 
    , c1.end_date as new_column 
from table1 c join table2 d on c.cid = d.cid 
       join talbe1 c1 on c.cid   = c1.cid 
           and c.customer_leg1 = c1.previous_customer_leg1 
.................. 
+0

你爲什麼加入c.cid = c1.cid呢? – Arman

+0

我認爲cid可能是您的表的主鍵,而customer_leg1(etc)只是一個屬性,可能會在表中出現多次。如果是這樣,那麼您不想將customer_leg1從一個cid關聯到另一個cid的previous_customer_leg1。當然,我的假設可能是錯誤的,但請記住,它只是一個比你原來的更大的查詢的要點。如果你想得到更仔細更詳細的答案,你需要提出一個更加細緻和詳細的問題。 – mathguy

+0

在這樣做,我得到「列不明確定義」錯誤 – Arman

0

正如我在評論中詢問的那樣,您將確保next row正確顯示的列有哪些列,因爲您無法保證您的輸出始終以相同的順序顯示。因此,假設您的order列爲creation_date,並且您希望在的partition上完成此操作,則可以在select語句中添加類似以下內容的內容來派生此列,而不會干擾查詢的其餘部分。

聲明:如果partitionorder的列不相同,那麼這將不起作用。請更改列。但的概念讀取下一行爲一列,如果匹配,則顯示下一行以下的另一列。

,CASE 
    WHEN lead (c.previous_customer_leg1,1) 
      over (partition BY c.cid ORDER BY c.creation_date) 
     = c.customer_leg1 
    THEN lead (c.end_date,1) over (partition BY c.cid ORDER BY c.creation_date) 
END AS new_column