使用条件查找列中的最大值(0是最大值,其中0存在)

时间:2018-03-08 02:23:37

标签: sql-server

列的值为' 00' 01'' 02',' 03',...
我想找出每个姓名的最大值。但是,如果有' 00'然后存在 最大值应为' 00'如果不是,则max是最大值

原始

名称值 汤姆| 00
汤姆| 01
汤姆| 02
简| 01
简| 02
简| 03
杰克| 00
杰克| 01

结果

名称值 汤姆| 00
简| 03
杰克| 00

'如果'声明会很好,但我认为必须有更简单的方法。

5 个答案:

答案 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;

SQL小提琴:http://sqlfiddle.com/#!18/c136b/7