我想知道如何将表连接到自身或使用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相同。
你能帮我理解我做错了什么以及如何使这个查询有效吗?
答案 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