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

Код: 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
Вопросы по Select
    #39567211
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
Вопросы по Select
    #39567214
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впрочем, канешно, еще можно тряхнуть стариной...

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

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
Вопросы по Select
    #39567220
Phoenix28d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Вопросы по Select
    #39567578
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Phoenix28dМинимальную дату неправильно находить
RLY? Вариант, что вы неправильно сформулировали задачу, и потому написанный для вас запрос выдает некорректный результат, в вашу светлую голову не пришел?
...
Рейтинг: 0 / 0
Вопросы по Select
    #39567770
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вопросы по Select
    #39567808
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вопросы по Select
    #39567829
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

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

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

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

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

Я с него начинал и никуда не уходил.
...
Рейтинг: 0 / 0
Вопросы по Select
    #39568257
Phoenix28d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Вопросы по Select
    #39569547
dbms_photoshopPS. На оракловом форуме есть один у которого все чудакиэто тонкий намек на Elic-а ???
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопросы по Select
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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