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

Откуда:
Сообщений: 3
Всем доброго дня!

Попалась задача, которую не могу выполнить.
Учусь работать в MSSQL 2014, но задание необходимо выполнить также и без оконных функций.

Формулируется оно так

create table dbo.statistics (
login varchar(64)
, send_date datetime
, sms_cnt int
)

Вывести: для каждого логина минимальную дату, когда количество сообщений было максимально, и максимальную дату, когда количество обнаружений было минимально, а также количество сообщений

Пример вывода


login min_date max_sms_cnt max_date min_sms_cnt
--------------------------------------------------------
|login1 | 20150411 | 15154 |20151012 | 10 |
|login2 | 20150301 | 20 |20160513 | 8 |



Я не понимаю, как задать условие для вывода связки "минимальная дата" - "максимальное кол-во смс". Получается связка "мин дата" - "соответствующее ей число смс".

Прошу подсказки, на что обратить внимание? Решать не прошу)
Заранее спасибо за любые советы и ссылки!
15 авг 16, 15:35    [19542463]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2014 оконные функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
eayuso,

видимо, надо найти записи с максимальным количеством сообщений и
из них оставить записи только с минимальной датой (как я понял написанное).
То есть
SELECT TOP(1) WITH TIES * FROM dbo.statistics ORDER BY sms_cnt  DESC, send_date
только для каждого login в отдельности, а не по всей таблице.
15 авг 16, 15:43    [19542511]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2014 оконные функции  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
select *
,first_value(send_date) over(partition by login order by sms_cnt  desc,send_date asc) as min_send_date_for_max_sms_cnt
,first_value(send_date) over(partition by login order by sms_cnt asc,send_date desc) as max_send_date_for_min_sms_cnt
from dbo.[statistics] 
15 авг 16, 16:13    [19542752]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2014 оконные функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
3unknown
select *
,first_value(send_date) over(partition by login order by sms_cnt  desc,send_date asc) as min_send_date_for_max_sms_cnt
,first_value(send_date) over(partition by login order by sms_cnt asc,send_date desc) as max_send_date_for_min_sms_cnt
from dbo.[statistics] 
Это выберет все записи из таблицы.
15 авг 16, 16:38    [19542933]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2014 оконные функции  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
select login,min_send_date_for_max_sms_cnt,max(sms_cnt) as max_sms_cnt,max_send_date_for_min_sms_cnt,min(sms_cnt) as min_sms_cnt
from(
select *
,first_value(send_date) over(partition by login order by sms_cnt  desc,send_date asc) as min_send_date_for_max_sms_cnt
,first_value(send_date) over(partition by login order by sms_cnt asc,send_date desc) as max_send_date_for_min_sms_cnt
from dbo.[statistics] 
) a
group by login,min_send_date_for_max_sms_cnt,max_send_date_for_min_sms_cnt
15 авг 16, 16:52    [19543024]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2014 оконные функции  [new]
eayuso
Member

Откуда:
Сообщений: 3
iap,
Спасибо!

А можно ли сделать просто вложенными запросами? Это к вопросу о MS SQL 2000

Если просто про логику вывода первой таблицы

select login, min_date, max_sms
from
(select distinct login
where max(sms) as max_sms
having min(date) as min_date
from dbo.statistics)
Group by login
15 авг 16, 23:00    [19544535]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2014 оконные функции  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
select s.login
,min(s.sms_cnt) as min_sms
,(select top 1 s1.send_date from dbo.[statistics] s1 where s1.login = s.login and s1.sms_cnt = min(s.sms_cnt) order by s1.send_date desc) as max_send_date_for_min_sms_cnt
,max(s.sms_cnt) as max_sms
,(select top 1 s2.send_date from dbo.[statistics] s2 where s2.login = s.login and s2.sms_cnt = max(s.sms_cnt) order by s2.send_date asc) as min_send_date_for_max_sms_cnt
from dbo.[statistics] s
group by s.login
15 авг 16, 23:12    [19544571]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2014 оконные функции  [new]
eayuso
Member

Откуда:
Сообщений: 3
3unknown,

Подскажите, пожалуйста, что за s? (s1,s2)
Не могу разобраться
16 авг 16, 13:45    [19547194]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2014 оконные функции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
eayuso,

from dbo.[statistics] s
16 авг 16, 13:59    [19547286]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2014 оконные функции  [new]
o-o
Guest
eayuso
что за s? (s1,s2)

alias
16 авг 16, 14:00    [19547288]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить