如何在同一个表中选择两个相同列的最大值?

时间:2015-06-04 06:41:01

标签: sql sql-server

     id1  id2  name
1     1    2   a
2     3    4   b
3     5    6   c
4     7    8   d
5     9    10  e

select id1, id2, name
from Emp3
where id2 in (select MAX(id2) from Emp3)

如何只打印最大数量?

5 个答案:

答案 0 :(得分:0)

使用

select id2
from Emp3
where id2 in (select MAX(id2) from Emp3)

这将只打印10

如果您想要这两列中的最大值,请使用

SELECT
    CASE 
        WHEN MAX(id1) >= MAX(id2) THEN MAX(id1)
        WHEN MAX(id2) >= MAX(id1) THEN MAX(id2)
    END AS MaxValue
FROM Emp3

答案 1 :(得分:0)

如果两个id列都已编制索引,请使用带UNION ALL的派生表:

select max(id)
from
(
 select max(id1) as id from Emp3
 union all
 select max(id2) from Emp3
)

如果未编入索引,请使用CASE

select max(case when id1 > id2 then id1
                when id2 > id1 then id2
                else coalesce(id1,id2) end)
from Emp3

此答案使用COALESCE来处理NULLs(如果有的话......)该表将只读一次。 (使用UNION解决方案,表将被读取两次,并且您不希望在没有任何索引的情况下执行此操作!)

旧答案:

我猜你想要id1 / id2值最高的行吗?

当没有其他具有更高id值的行时,返回一行:

select id1, id2, name
from Emp3 e1
where not exists (select 1 from Emp3 e2
                  where e2.id1 > e1.id1
                     or e2.id1 > e1.id2
                     or e2.id2 > e1.id1
                     or e2.id2 > e1.id2)

如果有平局,将返回两行。 (两行或多行具有相同的最高值。)

替代解决方案,使用TOP,与ORDER BY结合使用CASE来查找每行较大的id值:

select TOP 1 id1, id2, name
from Emp3
order by case when id1 > id2 then id1 else id2 end desc

备选方案3,使用UNION ALL查找最大ID的子查询:

select TOP 1 id1, id2, name
from Emp3
where (select max(case when id1 > id2 then id1 else id2 end) from Emp3) in (id1,id2)

答案 2 :(得分:0)

使用TOPORDER BY获取结果

SELECT TOP 1 ID2 FROM Emp3 ORDER BY ID2 DESC

答案 3 :(得分:0)

select max(id) from (
    select max(id1) as id from Emp3
    union
    select max(id2) as id from Emp3
)

答案 4 :(得分:0)

DECLARE @T TABLE (ID1 INT ,ID2 INT ,NAME VARCHAR(80))
INSERT INTO @T VALUES (1,2,'NME1')
INSERT INTO @T VALUES (3,4,'NME2')
INSERT INTO @T VALUES (5,6,'NME3')
INSERT INTO @T VALUES (7,8,'NME4')
INSERT INTO @T VALUES (9,10,'NME5')
INSERT INTO @T VALUES (11,12,'NME6')
SELECT * FROM @T

SELECT MAX(ID1) ID FROM 
(
SELECT ID1 FROM @T T1
UNION 
SELECT ID2 FROM @T T2
)TT