[TSQL] Написать запросик

nik93

есть таблица (id int, weight int)
оба столбца не уникальны
нужно из этой таблицы выбрать строки с максимальным weight для каждого из id.
например
1 1
1 2
2 3
5 4
5 3
5 6
получаем
1 2
2 3
5 6
я делаю так - создаю временную таблицу (id int, weight int) где id уже уникально,
а потом по ней пробегаюсь курсором и для каждого id заполняю weight максимальным
для данного id из первоначальной таблицы. Но как-то мне этот способ не нравится,
возможно такую штуку сделать без курсора и временных таблиц ?

0000


select id, max(weight) from Таблица group by id

nik93

жесть, какоеже я ламо, у меня явно мозг не под скул заточен...
спасибо

0000

Приходит тока с опытом :) Два года назад для меня это был супер запрос.

psvpolo

я до сих пор не научился понимать десятистраничные запросы с временными таблицами (ЗУП 1с 8.1) :(

Boris1980

На собственном опыте убедился, что если в системе появляются такие вот регулярные конструкции, то что-то в ней не так.
десятистраничные запросы с временными таблицами (ЗУП 1с 8.1)

psvpolo

в типовом ЗУПЕ есть ошибки в таких запросах, я их исправляю не трогая текста запроса - перебираю уже таблицу значений перед загрузкой в док - по крайней мере так удаеццо разграничить свои и чужие ошибки, а у них запросы писались разными людьми и очень часто в какихто нештатных ситуациях они не так отрабатываюццо (например автозаполнение начилсения аванса если сотрудник перешол из филиала в головную организацию)

Boris1980

Да я не спорю. Каждый свою матрицу настраивает как может.

0000

Иногда эти запросы пишут марсиане (люди, которым программирование противопоказано). И зачастую большой запрос можно переписать попроще.

nik93

а если в изначальной таблице помимо этих двух столбцов имеется еще несколько, как их тоже вывести с учетом исходной задачи?

psvpolo

И зачастую большой запрос можно переписать попроще.
сколь времени потребуеццо чтобы переписать 10-страничный запрос? я проковырялся день, нифига не в нем не понял, плюнул и за час все разобрал в таблицах значений. работодателю кстати пофиг как ты делаеш, главное чтоп быстрее - это отчасти объясняет кривость этих запросов, чтоп их во всех режимах проверить нада кучу времени, которое никто не хочет оплачивать..

Boris1980

select
id, sCode, sName,
max(weight)
from Таблица
group by id, sCode, sName

nik93

неа, бред выводит, я уже так пробовал

Boris1980

Что значит бред? Выводит именно то, что написано: группировку по трем полям таблицы и максимальное значение веса в группе.

Dasar

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

nik93

условие уникальности id не соблюдается, как в простом случае

Boris1980

Если для одного id несколько записей с максимальным весом, но с разными вспомогательными данными? Перечисление выводить... Я не телепат.

nik93

а нужно обычно вывести вспомогательные поля из максимальной записи, а не группировать по вспомогательным полям
на это ругается
Column 'Fields.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

nik93

Если для одного id несколько записей с максимальным весом, но с разными вспомогательными данными?
исключено - в пределах id вес уникален

Dasar

стандартная задача: по каждому объекту вывести значение с макс. отметкой времени

объект время значение
1 10:00 5
1 15:00 12
1 20:00 16
2 15:00 7
2 16:00 8

в данном случае, значение - и получается вспомогательным полем, которое не является ни ключом (полем для группировки ни критерием выбора(агрегирования)

Dasar

Если для одного id несколько записей с максимальным весом, но с разными вспомогательными данными?
в данном случае, вспомогательными полями было бы:
1. время измерения веса
2. источник сообщения о весе
3. кто внес запись в базу
и т.д.

Boris1980

Да я прекрасно все понимаю.

nik93

1. время измерения веса
2. источник сообщения о весе
3. кто внес запись в базу
а как их вывести? :)

Dasar

если база поддерживает аналитические функции, то через них, иначе придется трахаться со вложенными запросами.
если поле группировки одинночное, и weight уникален внутри группы, то как-то так:

select * from data
where data.weight=(select max(weight) from data as data2 where data2.id=data.id)

nik93

если база поддерживает аналитические функции, то через них
ms sql express

6yrop

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

6yrop

если поле группировки одинночное, и weight уникален внутри группы, то как-то так:
code:
select * from data
where data.weight=(select max(weight) from data as data2 where data2.id=data.id)
здесь ограничение "поле группировки одинночное" тоже не нужно

Dasar

> здесь ограничение "поле группировки одинночное" тоже не нужно
согласен

Dasar

> ms sql express
аналитику поддерживает.
ps
сходу запрос через аналитику не напишу

6yrop

а еще прикольно попробовать это на LINQ написать :)

artimon

select t.id, t.time, t.value from t left join t as x on (t.id = x.id and t.time < x.time) where x.time is null;

nik93

select * from data where data.weight=(select max(weight) from data as data2 where data2.id=data.id)
благодарствую - запахало :)
ЗЫ: интересно общественное мнение по поводу ламо-вопросов, наподобии этого в частности и многих предыдущих. Очевидно, что для гуру они представляют мало интереса, т.к. являются очевидными и мешают фильтровать ценные знания. С другой стороны что делать ламерам если появляется необходимость уточнить какой-либо, возможно не сложный, но не очевидный для них вопрос. У меня опыта написания серьезных вещей вообще нет, времени рыться в толстенной литературе не всегда есть, да и поиски могут затянуться, особенно если не знаешь, что искать. Рюхающих в этом деле коллег или друзей тоже нет. Дабы ускорить процесс поиска решения пишу сюда, но вот сколько я не писал в этот раздел, после каждого топика чувствую себя как, извините, обосранный :crazy:
Может стоит создать раздел (доп, альт, обсуждаемый) куда каждый может писать любые непонятные ему вещи, (пусть они буду элементарными для многих) не опасаясь быть посланым, осмеяным и т.п. :) и заодно маячить перед глазами не будет.
Как считаете?

pitrik2

Как считаете?
альт нафик
во-первых придется подписываться на еще один раздел, во-вторых при создании поста нужно будет мучительно думать в какой раздел его запостить
а ламовопросы я считаю нужно задавать не на форуме а в гугле
во-первых быстрее получишь ответ
во-вторых получишь кучу ответов и выбирешь больше понравившийся

nik93

ябы гуглу написал: "есть таблица такая, хочу такую" :grin:

hprt

можно поискать на sql.ru - там очень и очень много всего понаписано. Плюс там больше сочувствующих, которые помогут ;)
Это если конкретно по БД

0000

+1 за sql.ru
К тому же там можно спрашивать по конкретной БД. Я например на MS SQL аналитику совсем не знаю, а вот на Оракле написать твой запрос - 5 сек.

nik93

но родное МГУ комьюнити оноже как-то ближе чем всякие скулы.ру =)
ладно буду там мозг всем взрывать :p
Оставить комментарий
Имя или ник:
Комментарий: