Sql 如何在where子句中使用max?

Sql 如何在where子句中使用max?,sql,sql-server,Sql,Sql Server,在我们的数据库中,每个客户最多可以有3个电话号码,每个电话号码与一个ID\u电话号码、一个ID\u类型的电话和一个ID\u人相关 所以我需要做一个一般性的选择,它返回的电话号码的id\u type\u phone='2',并且与这个id\u人相关的id\u phone\u号码更高 此选择需要适用于我的整个数据库,因此我无法在其上指定id\u person 我有: SELECT (SELECT collun1.phone WHERE collun1.ID_type_phone = '2')

在我们的数据库中,每个客户最多可以有3个电话号码,每个电话号码与一个ID\u电话号码、一个ID\u类型的电话和一个ID\u人相关

所以我需要做一个一般性的选择,它返回的电话号码的id\u type\u phone='2',并且与这个id\u人相关的id\u phone\u号码更高

此选择需要适用于我的整个数据库,因此我无法在其上指定id\u person

我有:

SELECT 
  (SELECT collun1.phone WHERE collun1.ID_type_phone = '2')
FROM collun1
WHERE id_person = 4

我想要像这样的东西

SELECT 
  (SELECT collun1.phone WHERE collun1.ID_type_phone = '2' and max(id_phone_number)
FROM collun1
Select * from (
    Select  RANK() OVER (
        PARTITION BY id_person 
        ORDER BY id_phone_number desc) AS phoneRank
        ,*
    from    collun1
    WHERE   collun1.ID_type_phone = '2') as tempSub
where phoneRank = 1

使用以下语法:

SELECT id_person, phone 
FROM collun1 
WHERE ID_type_phone = '2' AND id_phone_number = (SELECT MAX(id_phone_number) FROM collun1 c WHERE c.id_person = collun1.id_person)

按分组可能会更快(取决于您的数据):


您可以使用SQL Server的Rank函数,并按分区和顺序进行排序

差不多

SELECT 
  (SELECT collun1.phone WHERE collun1.ID_type_phone = '2' and max(id_phone_number)
FROM collun1
Select * from (
    Select  RANK() OVER (
        PARTITION BY id_person 
        ORDER BY id_phone_number desc) AS phoneRank
        ,*
    from    collun1
    WHERE   collun1.ID_type_phone = '2') as tempSub
where phoneRank = 1

因此,我根据哈迪的答案创建了一个临时表

我做到了:`

CREATE TABLE ##Celphone (
Num_Phone varchar(14),
ID_Person numeric(8)); 

insert into ##Celphone (Num_Phone, ID_Person)
        SELECT Phone, ID_Person
        FROM COLLUN1 
        WHERE ID_Type_Phone = '2' AND ID_Phone = (SELECT MAX(ID_Phone) FROM COLLUN1 C WHERE C.ID_Person = COLLUN1.ID_Person)

SELECT DISTINCT
       ##Celphone.Num_Phone,
       ID_Person

这是非常接近我需要的。只有select为该用户的其他电话提供空值。我需要它根本不带空值例如添加id_person=4(这家伙有3部手机):ID_person New_collun_from_select_给定4 NULL 4 NULL 4 989361351我需要它只给出'4 989361351',因为其他2行NULL不存在,如果你也能帮我的话。。。无论如何,非常感谢你的帮助!