powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Transact sql: group by
6 сообщений из 6, страница 1 из 1
Transact sql: group by
    #33534773
_makSim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поделитесь, пожалуйста, опытом, кто как делает выборки следующего вида:
Произвольно сформированный набор (например, join нескольких таблиц)
нужно сгруппировать по некорому набору полей, для одного поля взять
агрегированное значение по группе (max или min) и взять поля, которые
не входят в набор из group by и соответствуют строкам, где находятся max
или min значение по группе.

Для понятности привожу пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table #t
(
  p1 int,
  p2 int,
  p3 int
)
insert into #t select  1 , 2 , 22 
insert into #t select  1 , 3 , 33 
insert into #t select  2 , 4 , 55 
insert into #t select  2 , 5 , 44 

Нужно сгруппировать по p1, для p3 взять max + соотв. p2
в данном случае нужно получить:
1,3,33
2,4,55

Мне пока на ум приходит только вот такой не очень красивый вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select
 t.p1,
 t.p2,
 t.p3
from #t t
join (select p1, max(p3) as p3 from #t group by p1) tt 
  on tt.p1=t.p1 and tt.p3=t.p3

Я использую ASE 12.5, если здесь это имеет значение.

Спасибо.
...
Рейтинг: 0 / 0
Transact sql: group by
    #33534877
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для Вашего примера надо сначала определиться с уникальными ключами в таблице или же соединять по всем полям и делать DISTINCT, если не нужны повторяющиеся значения.
...
Рейтинг: 0 / 0
Transact sql: group by
    #33534973
_makSim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут предполагается, что для одного значения p1 значения p3 не повторяются, p2 - любое.
#t - можно рассматривать как join из нескольких таблиц.
Суть в том, что часть полей в group by, одно в агрегате, а ещё часть не там и не там.
...
Рейтинг: 0 / 0
Transact sql: group by
    #33535367
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попытаться объединить p2 с р3, сделать max, а потом разделить
(все через char), что-то типа:

select p1, convert(int,substring(max(str(p2,1)+(str(p3,2))),1,1)), convert(int,substring(max(str(p2,1)+str(p3,2)),2,2)) --,p3
from #t
group by p1
go

Mожет длину при конвертировании подинамичнее вычислять тоже.
...
Рейтинг: 0 / 0
Transact sql: group by
    #33535381
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry, перепутал p2 c p3, должно быть:
select p1, convert(int,substring(max(str(p3,2)+(str(p2,1))),3,1)), convert(int,substring(max(str(p3,2)+str(p2,1)),1,2))
from #t
group by p1
go
...
Рейтинг: 0 / 0
Transact sql: group by
    #33536376
Алексей Л.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select t1.p1, max(t1.p3), t2.p2
from #t t1, #t t2
where t1.p1 = t2.p1
and t2.p3 = (select max(t3.p3) from #t t3 where t1.p1 = t3.p1)
group by t1.p1,t2.p2
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Transact sql: group by
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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