2010-05-27 49 views
1

我有這個疑問:如何在SQL查詢中添加列, LEFT OUTER JOIN

SELECT p.ProductName, 
      dt.MaxTimeStamp, 
      p.Responsible 
    FROM Product p 
LEFT JOIN (SELECT ProductID, MAX(TimeStamp) AS MaxTimeStamp 
      FROM StateLog 
      WHERE State = 0 
     GROUP BY ProductID, State) dt ON p.ProductID = dt.ProductID 
ORDER BY p.ProductName; 

它的工作原理像它應該,但現在我需要選擇「國家」出來了。

棘手的部分是,我只想要最新的「時間戳」,其中「狀態」爲假。 但現在我還需要最新的「TimeStamp」的「國家」。

我嘗試這樣做:

SELECT p.ProductName, dt.State, dt.MaxTimeStamp, p.Responsible 
    FROM Product p 
LEFT JOIN (SELECT ProductID, MAX(TimeStamp) AS MaxTimeStamp, State 
      FROM StateLog 
      WHERE State = 0 
     GROUP BY ProductID, State) dt ON p.ProductID =dt.ProductID 
ORDER BY p.ProductName; 

但它沒有工作,因爲它給我的「國家」,爲最新的「時間戳」。

所以我希望有一些聰明的頭腦可以幫助我。我猜測這要麼很簡單,要麼很難解決。

+0

Thx爲我編輯它tvanfosson。下次我會盡力讓自己變得更好。 – radbyx 2010-05-27 00:31:03

+1

但您過濾'state = 0',所以狀態將始終爲0 ... – 2010-05-27 00:31:44

+0

@radbyx - 使用0101按鈕或縮進代碼樣本4個空格。你也可以使用反引號''''來排列格式。 – tvanfosson 2010-05-27 00:32:44

回答

1

掙扎破譯你在找什麼,但字裏行間可以把它概括爲:

1)最近StateLog.Timestamp其中國家是最近StateLog零

2)國家。時間戳

在這種情況下,以下(相當醜陋)的查詢可能會起作用。假設你的團隊中的'狀態'欄是'State'的錯字,因爲它沒有返回到任何地方。

SELECT 
    p.ProductName 
    , sl.State AS StateWithLatestTimeStamp 
    , MAX(CASE WHEN dt1.State = 0 THEN dt1.MaxTimeStamp ELSE NULL END) AS LatestStateZeroTimeStamp 
FROM 
    (
    SELECT 
     ProductID 
     , State 
     , MAX(TimeStamp) AS MaxTimeStamp 
    FROM 
     StateLog 
    GROUP BY 
     ProductId 
     , State 
    ) dt1 
INNER JOIN 
    StateLog sl 
ON sl.ProductID = dt1.ProductID 
INNER JOIN 
    Product p 
ON p.ProductID = sl.ProductID 
GROUP BY 
    p.ProductName 
    , sl.State 
    , sl.TimeStamp 
HAVING 
    sl.TimeStamp = MAX(dt1.MaxTimeStamp) 
+0

Thx,它沒有改變任何東西。 我喜歡描述目標的簡短方式,我從現在開始做。 你的Assumsion是正確的,正如我在評論中提到的那樣。 – radbyx 2010-05-27 08:19:18

0

tvanfosson和OMG Ponies的大格式化工作。

當使用GROUP BY每列需要任一:
1.具有施加到它的聚集函數,或
2.出現GROUP BY子句。

我不知道Status是什麼,但我假設你需要它。
因此,這是你的查詢應該如何看一個例子:

SELECT p.ProductName, dt.State, dt.MaxTimeStamp, p.Responsible 
    FROM Product p 
LEFT JOIN (SELECT ProductID, Status, 
        MAX(State) as State, MAX(TimeStamp) AS MaxTimeStamp 
      FROM StateLog 
      WHERE State = 0 
     GROUP BY ProductID, Status) dt ON p.ProductID = dt.ProductID 
ORDER BY p.ProductName; 

但所有這一切是愚蠢的,因爲,在留言中提到,您可以通過State = 0過濾所以沒有可能性,你的查詢將返回任何東西除了國家0以外。

+0

狀態和狀態是一樣的,對不起我的壞。 – radbyx 2010-05-27 11:12:38

0
with cte(Productid,TimeStamp,State,Status) as 
(select productid,TimeStamp,State,status, 
max(timestamp) over (partition by productid,status) as max1 
from statelog 
) 

SELECT p.ProductName, 
      dt.MaxTimeStamp, 
      p.Responsible 
    FROM Product p 
LEFT JOIN(
select productid,max(case when state=0 then TimeStamp else null end) as MaxTimeStamp, 
max(case when Timestamp=max1 then state else null end) as MaxState, 
from statelog 
group by productid,status) 
dt ON p.ProductID = dt.ProductID 
ORDER BY p.ProductName; 

我想知道如果你的邏輯是有點糊塗。我看你是按狀態分組,但你不使用狀態的任何地方。 我無法測試這一點,但如果您發佈表創建腳本和數據填充腳本,我們可以快速測試它。

+0

狀態和狀態是一樣的,對不起我的壞。 – radbyx 2010-05-27 11:12:04