Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопросы по Select / 13 сообщений из 13, страница 1 из 1
10.12.2017, 10:13:14
    #39567207
Phoenix28d
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
Дана таблица:

Код: sql
1.
2.
3.
4.
create table dbo.statistics 
(login    varchar(64),
send_date date, 
sms_cnt   int )



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

Ожидаемый результат:
Код: sql
1.
2.
3.
4.
| login | min_date | max_sms_cnt | max_date |min_sms_cnt |
+-------+----------+-------------+----------+------------+
|login1 | 20150411 | 15154       | 20151012 | 10         |
|login2 | 20150301 | 20          | 20160513 | 8          |



Мой запрос, правильно ли:

Код: sql
1.
2.
3.
4.
select 
      [login], min(send_date) mindate, max(sms_cnt) maxcnt,
      max(send_date) maxdate, min(sms_cnt) mincnt
from [dbo].[statistics] (nolock)


Если неправильно помогите пжл с запросами как правильно)
...
Рейтинг: 0 / 0
10.12.2017, 11:07:53
    #39567211
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
Код: sql
1.
2.
3.
4.
5.
select *
  from ( select distinct login from dbo.statistics ) as l
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt desc, send_date asc ) as max
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt asc, send_date desc ) as min
;
...
Рейтинг: 0 / 0
10.12.2017, 11:19:23
    #39567214
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
Впрочем, канешно, еще можно тряхнуть стариной...

коррелированный запрос:

min (max пишется онологично)
Код: sql
1.
2.
select * from dbo.[statistics] as s where sms_cnt = (select min(sms_cnt) from dbo.[statistics] where [login] = s.[login] )
                                          and send_date = (select max(send_date) from dbo.[statistics] where [login] = s.[login] and sms_cnt = s.sms_cnt )



Но это выносит мозг современным кнопкодавам.
...
Рейтинг: 0 / 0
10.12.2017, 12:00:58
    #39567220
Phoenix28d
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
aleks222
Код: sql
1.
2.
3.
4.
5.
select *
  from ( select distinct login from dbo.statistics ) as l
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt desc, send_date asc ) as max
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt asc, send_date desc ) as min
;



Минимальную дату неправильно находить
...
Рейтинг: 0 / 0
11.12.2017, 11:45:50
    #39567578
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
Phoenix28dМинимальную дату неправильно находить
RLY? Вариант, что вы неправильно сформулировали задачу, и потому написанный для вас запрос выдает некорректный результат, в вашу светлую голову не пришел?
...
Рейтинг: 0 / 0
11.12.2017, 16:13:23
    #39567770
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
aleks222
Код: sql
1.
2.
3.
4.
5.
select *
  from ( select distinct login from dbo.statistics ) as l
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt desc, send_date asc ) as max
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt asc, send_date desc ) as min
;

Зачем два self join если можно одним проходом?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select login,
       max(case when rn1 = 1 then send_date end) min_date,
       max(case when rn1 = 1 then sms_cnt end) max_sms_cnt,
       max(case when rn2 = 1 then send_date end) max_date,
       max(case when rn2 = 1 then sms_cnt end) min_sms_cnt
  from (select row_number() over (partition by login order by sms_cnt desc, send_date asc) rn1,
               row_number() over (partition by login order by sms_cnt asc, send_date desc) rn2,
               s0.*
          from statistics s0) s1
 where 1 in (rn1, rn2)
group by login


в Oracle это просто группировка + keep
Код: sql
1.
2.
3.
4.
5.
6.
7.
select login,
       min(send_date) keep (dense_rank first order by sms_cnt desc) min_date,
       max(sms_cnt) max_sms_cnt,
       max(send_date) keep (dense_rank first order by sms_cnt asc) max_date,
       min(sms_cnt) minax_sms_cnt
  from statistics
group by login

...
Рейтинг: 0 / 0
11.12.2017, 16:44:09
    #39567808
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
dbms_photoshopaleks222
Код: sql
1.
2.
3.
4.
5.
select *
  from ( select distinct login from dbo.statistics ) as l
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt desc, send_date asc ) as max
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt asc, send_date desc ) as min
;

Зачем два self join если можно одним проходом?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select login,
       max(case when rn1 = 1 then send_date end) min_date,
       max(case when rn1 = 1 then sms_cnt end) max_sms_cnt,
       max(case when rn2 = 1 then send_date end) max_date,
       max(case when rn2 = 1 then sms_cnt end) min_sms_cnt
  from (select row_number() over (partition by login order by sms_cnt desc, send_date asc) rn1,
               row_number() over (partition by login order by sms_cnt asc, send_date desc) rn2,
               s0.*
          from statistics s0) s1
 where 1 in (rn1, rn2)
group by login


в Oracle это просто группировка + keep
Код: sql
1.
2.
3.
4.
5.
6.
7.
select login,
       min(send_date) keep (dense_rank first order by sms_cnt desc) min_date,
       max(sms_cnt) max_sms_cnt,
       max(send_date) keep (dense_rank first order by sms_cnt asc) max_date,
       min(sms_cnt) minax_sms_cnt
  from statistics
group by login



Затем, страдалец, что реальные посоны не лопатят фсю таблу по каждому поводу.
Редко, панимашь, кому надобен весь список гопом.
А два join дают индексам шанс.
...
Рейтинг: 0 / 0
11.12.2017, 17:00:19
    #39567829
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
aleks222,

То есть было сделано предположение про
1) низкую кардинальность login
2) высокую кардинальность send_date, sms_cnt в рамках login
3) наличие необходимых индексов

PS. На оракловом форуме есть один у которого все чудаки, а у тебя страдальцы.
Не совсем понятно зачем так выпячивать свои психологические травмы.
...
Рейтинг: 0 / 0
11.12.2017, 17:39:41
    #39567862
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
dbms_photoshop,

Я бы на тебя посмотрел, если бы тебя чмырили всю юность, псехолог блин.
...
Рейтинг: 0 / 0
11.12.2017, 18:05:26
    #39567894
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
dbms_photoshop,

ты тоже начал в mssql переезжать?
или уже давно?
...
Рейтинг: 0 / 0
11.12.2017, 18:35:38
    #39567912
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
andreymx,

Я с него начинал и никуда не уходил.
...
Рейтинг: 0 / 0
12.12.2017, 12:50:30
    #39568257
Phoenix28d
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по Select
Phoenix28daleks222
Код: sql
1.
2.
3.
4.
5.
select *
  from ( select distinct login from dbo.statistics ) as l
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt desc, send_date asc ) as max
         outer apply( select top(1) * from  dbo.statistics where login = l. login order by sms_cnt asc, send_date desc ) as min
;



Минимальную дату неправильно находить

Извиняюсь ваш ответ правильно находить, спасибо
...
Рейтинг: 0 / 0
14.12.2017, 12:21:53
    #39569547
Вопросы по Select
dbms_photoshopPS. На оракловом форуме есть один у которого все чудакиэто тонкий намек на Elic-а ???
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопросы по Select / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]