#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