根据最大值加入

时间:2013-09-29 09:03:01

标签: sql sql-server tsql max aggregate-functions

我想知道如何将表连接到自身或使​​用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

但我被告知Lastname不在group by子句中。但是,如果我对Lastname,firstname,filename进行分组,那么max_filename中的所有内容都与filename相同。

你能帮我理解我做错了什么以及如何使这个查询有效吗?

3 个答案:

答案 0 :(得分:5)

实际上你非常接近,但不是使用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 :(得分: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

但我不确定你的max filename是什么意思?所有记录的最大总数?或者单独为每个名字?您的预期结果也不匹配。让我知道,我将修改查询。

答案 2 :(得分: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