Как использовать max в предложении where?

#sql #sql-server

#sql #sql-сервер

Вопрос:

В нашей базе данных у каждого клиента может быть до 3 телефонных номеров, и каждый телефонный номер связан с ID_phone_number, ID_type_phone и id_person.

Итак, мне нужно выполнить общий select, где он возвращает номер телефона, который имеет id_type_phone = ‘2’ и имеет более высокий id_phone_number, связанный с этим id_person.

Этот выбор должен работать для всей моей базы данных, поэтому я не могу указать в нем id_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
  

Ответ №1:

Вы могли бы использовать функцию ранжирования SQL Server с РАЗДЕЛЕНИЕМ и УПОРЯДОЧИТЬ ПО

Что-то вроде

 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
  

Ответ №2:

GROUP BY Вероятно, было бы быстрее (в зависимости от ваших данных):

 SELECT id_person, MAX(ID_phone_number) 
FROM collun1 
WHERE ID_type_phone = '2' 
GROUP BY id_person
  

Ответ №3:

Используйте следующий синтаксис:

 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)
  

Комментарии:

1. Это очень близко к тому, что мне нужно. Только то, что select выдает мне нули для других телефонов, которые есть у этого человека. Я хочу, чтобы он вообще не приводил нули, Например, добавив id_person = 4 (у этого парня 3 телефона): ID_person New_collun_from_select_given 4 NULL 4 NULL 4 989361351 Мне нужно, чтобы он выдавал только ‘4 989361351’, поскольку другие 2 строки с null никогда не существовали, если бы вы могли мне помочь и с этим… В любом случае, большое спасибо за помощь!

Ответ №4:

Итак, я получил это, создав временную таблицу на основе ответа Хади.

Я сделал:`

 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