列的值为' 00' 01'' 02',' 03',...
我想找出每个姓名的最大值。但是,如果有' 00'然后存在
最大值应为' 00'如果不是,则max是最大值
原始
名称值
汤姆| 00
汤姆| 01
汤姆| 02
简| 01
简| 02
简| 03
杰克| 00
杰克| 01
结果
名称值
汤姆| 00
简| 03
杰克| 00
'如果'声明会很好,但我认为必须有更简单的方法。
答案 0 :(得分:1)
您需要检查值' 00'存在于该人并且如果是真的则使用它。
如果不是,请计算MAX值。
SELECT Name, ISNULL((SELECT Value FROM [table1] t WHERE t.Name = [table1].Name AND Value = '00'), MAX(Value)) AS Value
FROM [table1]
GROUP BY Name;
你可以在这个SQLFiddle上看到它:http://sqlfiddle.com/#!18/c136b/1/0
答案 1 :(得分:0)
示例数据
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
DROp TABLE #Temp
;With CTE_Temp(Name,Value)
AS
(
SELECT 'Tom' , 00 UNION ALL
SELECT 'Tom' , 01 UNION ALL
SELECT 'Tom' , 02 UNION ALL
SELECT 'Jane' , 01 UNION ALL
SELECT 'Jane' , 02 UNION ALL
SELECT 'Jane' , 03 UNION ALL
SELECT 'Jack' , 00 UNION ALL
SELECT 'Jack' , 01
)
SELECT * INTO #Temp FROm CTE_Temp
尝试以下脚本
;WITH CTE_Final
AS
(
SELECT Name
,Value
,ROW_NUMBER()OVER(PArtition BY Name ORDER By value ) AS Rnk
,ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) AS Seq
FROM
(
SELECT Name,
IIF(value=0,0, MAX(Value)OVER(Partition by Name ORDER BY Value DESC)) AS Value
From #temp
GROUP BY Name,Value
)dt
)
SELECT Name,
RIGHT('00'+CAST(Value AS varchar(5)),2) AS Value
FROM CTE_Final
WHERE Rnk=1
ORDER BY Name DESC
结果
Name Value
-------------
Tom 00
Jane 03
Jack 00
答案 2 :(得分:0)
我在另一篇文章中找到了一个有趣的解决方案,感谢Soukai。
Is there anything possible idea of 'cyclic arithmetic operation' for some specific data type?
Select Name, RIGHT('00' + CONVERT(VARCHAR, (max((convert(int, Value) - 1) & 255) + 1) & 255), 2) as Value from Table;
00 01 02 03 04 ... 99:00为最大值,对于其他人,最大值为最大
↓'循环减少' 1
255 00 01 02 03 ... 98:找到255最大值,原来是00,如果不是,
仍然最大为最大
↓'循环增加' 1
00 01 02 03 04 ... 99:完成。
答案 3 :(得分:0)
case max(case when val = '00' then '9999' else val end)
when '9999' then '00' else max(val) end
或
case min(val) when '00' then '00' else max(val) end
答案 4 :(得分:0)
试试这个:
SELECT Name, CASE WHEN Min(Value)='00' THEN Min(Value)
ELSE Max(Value) END
FROM [table1]
GROUP BY Name;