Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос по функции MAX()  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Добрый день
Подскажите, пожалуйста, поведение функции max() в каждом из вариантов (чем будет отличаться набор значений, полученных при использовании max в where, и в select)?

Вариант_1:
select 
c.Name as 'Client',
s.JobStatusLong as 'Status',
j.EndTime,  
(case when j.JobErrors ='1' then 'err' else 'Ok' end) as JobErrors
from Job j 
     inner join Client c on c.ClientId=j.ClientId
     inner join Status s on s.JobStatus=j.JobStatus
where j.EndTime=(select max(j1.EndTime) from Job j1 where j1.ClientId=j.ClientId)


Вариант_2:
select 
c.Name as 'Client',
s.JobStatusLong as 'Status',
max(j1.EndTime) as 'max_EndTime',  
(case when j.JobErrors ='1' then 'err' else 'Ok' end) as JobErrors
from Job j 
     inner join Client c on c.ClientId=j.ClientId
     inner join Status s on s.JobStatus=j.JobStatus
23 фев 15, 10:22    [17300880]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по функции MAX()  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
2viper2viper
Подскажите, пожалуйста, поведение функции max() в каждом из вариантов (чем будет отличаться набор значений, полученных при использовании max в where, и в select)?
Во втором варианте будет синтаксическая ошибка - нету group by

Если добавить group by по Name, JobStatusLong, case, то запрос выведет уникальный набор этих полей, и максимум EndTime для каждого из них.

А в первом варианте запрос выведет все записи, у которых EndTime равен максимальному.
23 фев 15, 10:51    [17300941]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по функции MAX()  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
alexeyvg, group by есть, не скопировал при создании поста. Спасибо
То есть, в первом варианте, при единственном наиболее позднем значении EndTime будет выгружена одна строка?
23 фев 15, 10:59    [17300968]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по функции MAX()  [new]
o-o
Guest
2viper2viper
То есть, в первом варианте, при единственном наиболее позднем значении EndTime будет выгружена одна строка?

только если ClientId, JobStatus уникальны в соответствующих таблицах
23 фев 15, 11:35    [17301056]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по функции MAX()  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
o-o,

ну тогда получается, что вариант 1 ничем не отличается от варианта 2?..

Правильно ли я понимаю?
Вариант 1:
Name, JobStatusLong, case, которые указаны для наибольшей даты. если значений наибольшей даты в таблице Job два, в результате будет выгружено две строки, не зависимо от уникальности значений Name, JobStatusLong, case.
Вариант 2:
Максимальная дата для каждой комбинации Name, JobStatusLong, case
23 фев 15, 12:09    [17301135]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по функции MAX()  [new]
o-o
Guest
2viper2viper,

то что понимаете по пунктам -- да,
но равноценны ли варианты -- зависит от ваших данных.
по логике, уникальному ClientId должен соответствовать уникальный Name,
но если это люди, то мало ли однофамильцев?
и тогда результаты конечно будут разными (когда дата неуникальна):

declare @Job table (ClientId int, JobStatus int, EndTime datetime);
insert into @Job values (1, 1, '20150101'), (2, 1, '20150101');

declare @Client table (ClientId int primary key, Name varchar(100));
insert into @Client values (1, 'Ivanov'), (2, 'Ivanov');

declare @Status table (JobStatus int primary key, JobStatusLong varchar(10));
insert into @Status values (1, '1'), (0, '0');

select 
c.Name as 'Client',
s.JobStatusLong as 'Status',
j.EndTime  
--(case when j.JobErrors ='1' then 'err' else 'Ok' end) as JobErrors
from @Job j 
     inner join @Client c on c.ClientId=j.ClientId
     inner join @Status s on s.JobStatus=j.JobStatus
where j.EndTime=(select max(j1.EndTime) from @Job j1 where j1.ClientId=j.ClientId)
---
Client	Status	EndTime
Ivanov	1	2015-01-01 00:00:00.000
Ivanov	1	2015-01-01 00:00:00.000

select 
c.Name as 'Client',
s.JobStatusLong as 'Status',
max(j.EndTime) as 'max_EndTime'  
--(case when j.JobErrors ='1' then 'err' else 'Ok' end) as JobErrors
from @Job j 
     inner join @Client c on c.ClientId=j.ClientId
     inner join @Status s on s.JobStatus=j.JobStatus
group by c.Name, s.JobStatusLong
---
Client	Status	max_EndTime
Ivanov	1	2015-01-01 00:00:00.000
23 фев 15, 12:46    [17301235]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по функции MAX()  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
o-o,

Спасибо за ответ. узнал что хотел
24 фев 15, 12:58    [17304722]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить