Помогите с группировкой

Обсуждение технических вопросов работы с системами управления базами данных (СУБД), работе с языком SQL и скриптовыми языками.
Ответить
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Помогите с группировкой

Сообщение Александр »

не могу сообразить есть короче запрос

Код: Выделить всё

Select   
       vv1.value as dCltID,
       vv3.value as dNote,
       vv2.value as dManager,
       vv13.value as dLastDate   
  From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id = tw.id left join 
       lsdbo.attrib_value av3 on rw.id = av3.object_id and av3.attrib_id = 3000000000123 left join 
       lsdbo.value_string vv3 on av3.value_id = vv3.id and av3.attrib_id = 3000000000123 left join
       lsdbo.attrib_value av1 on rw.id = av1.object_id and av1.attrib_id = 100004081100000 left join 
       lsdbo.value_numeric vv1 on av1.value_id = vv1.id and av1.attrib_id = 100004081100000 left join
       lsdbo.attrib_value av2 on rw.id = av2.object_id and av2.attrib_id = 3000000000122 left join 
       lsdbo.value_string vv2 on av2.value_id = vv2.id and av2.attrib_id = 3000000000122 left join
       lsdbo.attrib_value av13 on rw.id = av13.object_id and av13.attrib_id = 9 left join 
       lsdbo.value_datetime vv13 on av13.value_id = vv13.id and av13.attrib_id = 9
 where tw.mnemo in ('Call') 
получается таблица где одинаковых объектов с id dCltID может быть несколько но дата изменения dLastDate у каждого своя уникальная
и мне нужно оставить только по одному id из одинаковых - с самой поздней датой (чтобы работать с ними в другом запросе), но - могу сделать только так

Код: Выделить всё

Select   
       vv1.value , max(vv13.value)
  From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id = tw.id left join 
       lsdbo.attrib_value av1 on rw.id = av1.object_id and av1.attrib_id = 100004081100000 left join 
       lsdbo.value_numeric vv1 on av1.value_id = vv1.id and av1.attrib_id = 100004081100000 left join
       lsdbo.attrib_value av13 on rw.id = av13.object_id and av13.attrib_id = 9 left join 
       lsdbo.value_datetime vv13 on av13.value_id = vv13.id and av13.attrib_id = 9 
 where tw.mnemo in ('Call') 
 group by vv1.value
 order by  vv1.value
повторяющиеся id уходят остаются с максимальной датой - но не могу добавить в этот запрос атрибуты dNote, dManager - группировка (group by vv1.value,vv2.value,vv3.value) все сразу убивает если больше одного поля
не подскажите как правильно нарисовать запрос?

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Помогите с группировкой

Сообщение Александр »

Юрий, Андрей - вся надежда на вас :wink: - работа встала чтоб ее :wink:
давайте по другому скажу - попробую проще...
есть типа таблица

Код: Выделить всё

id        date           note                 manager
10      01.03.2009      чего-то там         кто-то там 
10      02.03.2009      чего-то там         кто-то там 
23      22.01.2009      чего-то там         кто-то там 
44      22.01.2009      чего-то там         кто-то там 
44      20.01.2009      чего-то там         кто-то там 
76      10.01.2009      чего-то там         кто-то там 
как из нее получить

Код: Выделить всё

id        date          note                 manager
10      02.03.2009      чего-то там         кто-то там 
23      22.01.2009      чего-то там         кто-то там 
44      22.01.2009      чего-то там         кто-то там 
76      10.01.2009      чего-то там         кто-то там 
??? т.е. уникальные id отобранные по максимальной дате

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Помогите с группировкой

Сообщение Александр »

Вы не поверите - мне ответили на sql.ru!!!!!!!!!!!!!!! :wink:
вот если кому интересно

Код: Выделить всё

Select   TOP 1 WITH TIES
       vv1.value as dCltID,
       vv3.value as dNote,
       vv2.value as dManager,
       vv13.value as dLastDate   
  From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id = tw.id left join
       lsdbo.attrib_value av3 on rw.id = av3.object_id and av3.attrib_id = 3000000000123 left join
       lsdbo.value_string vv3 on av3.value_id = vv3.id and av3.attrib_id = 3000000000123 left join
       lsdbo.attrib_value av1 on rw.id = av1.object_id and av1.attrib_id = 100004081100000 left join
       lsdbo.value_numeric vv1 on av1.value_id = vv1.id and av1.attrib_id = 100004081100000 left join
       lsdbo.attrib_value av2 on rw.id = av2.object_id and av2.attrib_id = 3000000000122 left join
       lsdbo.value_string vv2 on av2.value_id = vv2.id and av2.attrib_id = 3000000000122 left join
       lsdbo.attrib_value av13 on rw.id = av13.object_id and av13.attrib_id = 9 left join
       lsdbo.value_datetime vv13 on av13.value_id = vv13.id and av13.attrib_id = 9
where tw.mnemo in ('Call')
ORDER BY  ROW_NUMBER() OVER(PARTITION BY vv1.value ORDER BY vv13.value DESC)
я не понял как это работает - но и не заморачиваюсь больше! :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Помогите с группировкой

Сообщение Старик Крупский »

Круто! Я уж начал distinct прилаживать...
"Лучше меньше, да лучше" (C)
Юрий
Активный участник
Сообщения: 239
Зарегистрирован: 13 янв 2005, 14:30
Используемое ПО: Lotsia PDM PLUS LT
Откуда: Украина, Донецк
Контактная информация:

Re: Помогите с группировкой

Сообщение Юрий »

К сожалению это работает только с 2005 сервера. :(
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Помогите с группировкой

Сообщение Александр »

ну да...
хотя для меня конечно к счастью, там можно еще как-то сделать типа

Код: Выделить всё

select * from
(Select   
       *, max(date) over(partition by id) max_date
  From ...
) t
where date = max_date
order by id
но наверно это тоже для 2005....

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Юрий
Активный участник
Сообщения: 239
Зарегистрирован: 13 янв 2005, 14:30
Используемое ПО: Lotsia PDM PLUS LT
Откуда: Украина, Донецк
Контактная информация:

Re: Помогите с группировкой

Сообщение Юрий »

Для 2000 подойдет такой запрос

Код: Выделить всё

select set1.* from 
(select id, level, max(pos) pos
from dbo.ZadanijaSett
group by id, level) filt
inner join dbo.ZadanijaSett set1 on set1.id=filt.id
and set1.level=filt.level and set1.pos=filt.pos
order by set1.id, set1.level, set1.pos
Во вложенном запросе мы получаем ключевые поля, а затем фильтруем по ним исходную
таблицу в этом случае поле pos является аналогом твоей даты.
Ответить