2013-09-29 83 views
1

我想知道如何將剩餘的表連接到自身或使​​用case語句在視圖中分配最大值。說我有如下表:根據最大值加入

Lastname  Firstname  Filename 
Smith  John   001 
Smith  John   002 
Smith  Anna   003 
Smith  Anna   004 

我想創建列出所有值的觀點,但也有顯示當前行是否是最大行的另一列,如:

Lastname  Firstname  Filename  Max_Filename 
Smith  John   001   NULL 
Smith  John   002   002 
Smith  Anna   003   NULL 
Smith  Anna   004   NULL 

這可能嗎?我曾嘗試以下查詢:

SELECT Lastname, Firstname, Filename, CASE WHEN Filename = MAX(FileName) 
THEN Filename ELSE NULL END AS Max_Filename 

但我被告知姓氏不在group by子句中。但是,如果我將Lastname,firstname,filename分組,則max_filename中的所有內容都與文件名相同。

你能幫我理解我做錯了什麼,以及如何使這個查詢工作?

回答

4

其實你很接近,但不是使用max簡單彙總您可以使用max作爲窗口函數:

select 
    Lastname, Firstname, Filename, 
    case 
     when Filename = max(Filename) over(partition by Lastname, Firstname) then Filename 
     else null 
    end as Max_Filename 
from Table1 

sql fiddle demo

+1

第二次你用更優雅的解決方案打敗我。我敢肯定,不會是最後一次。 雖然我有一個問題:你的查詢有更復雜的執行計劃並且運行速度較慢(儘管這可能取決於數據,索引 - 我沒有做太多的測試)。這是預期的嗎? – Szymon

+1

你怎麼能說這些@Szymon?除非一切都在索引中,否則兩個查詢都必須全面掃描表;你的查詢將不得不在firstname,lastname上進行第二次掃描(假設它已被編入索引),所以應該可能有更復雜的執行計劃並且運行速度更慢。 – Ben

+1

好吧,還沒有檢查過執行計劃,但實際上我確信你的查詢中的兩個掃描(或尋找)應該比我的掃描慢。你有sqlfiddle的例子嗎? –

1

這可能是類似的東西:

SELECT 
    T.Lastname, 
    T.FirstName, 
    T.Filename, 
    CASE (SELECT MAX(T1.Filename) FROM MyTable T1 
      WHERE T.Lastname = T1.Lastname AND T.FirstName = T1.FirstName) 
     WHEN T.Filename THEN T.Filename 
     ELSE NULL 
    END 
FROM MyTable T 

但我不知道你最大的文件名是什麼意思?所有記錄中的最大總數?或者分別爲每個名字?您的預期結果不匹配。讓我知道,我會修改查詢。

+0

我指的是每個名/姓組合的最大值。謝謝您的回答! – user1422348

0

試試這個。

DECLARE @TAB2 TABLE(LASTNAME VARCHAR(40), FIRSTNAME VARCHAR(40), FILENAME VARCHAR(40)) 
INSERT INTO @TAB2 VALUES 
('Smith',  'John',   '001'), 
('Smith',  'John',   '002'), 
('Smith',  'Anna',   '003'), 
('Smith',  'Anna',   '004') 

SELECT 
    LASTNAME, 
    FIRSTNAME, 
    FILENAME, 
    CASE ROW_NO WHEN 2 THEN FILENAME ELSE NULL END AS MAX_FILENAME 
FROM 
(
    SELECT 
     LASTNAME, 
     FIRSTNAME, 
     FILENAME, 
     ROW_NO = ROW_NUMBER() OVER (PARTITION BY FIRSTNAME ORDER BY FILENAME ASC) 
    FROM @TAB2 
)A