#sql #sql-server #sql-server-2005
#sql #sql-сервер #sql-server-2005
Вопрос:
Id User Val1 Val2
11910115 Fred 123 -0.000137
11910116 Fred 456 0
11910117 Fred 789 0.0002
11910118 Sue 101 8.7E-05
11910119 Sue 102 0.000125
11910120 Sue 103 0
Намерение:
Select Id,User,Val1,Max(abs(val2)) val2
From MyTable
Group By User
Что мне нужно, так это:
11910117 Fred 789 0.0002
11910119 Sue 102 0.000125
Я бы согласился на это:
11910117 0.0002
11910119 0.000125
Однако я не могу обойти «недопустимо в списке выбора, поскольку оно не содержится ни в одном из агрегатов …»
Комментарии:
1. И какой из них недопустим в списке выбора?
Ответ №1:
SELECT y.Id, y.User, y.Val1, t.MaxVal
FROM YourTable y
INNER JOIN (SELECT User, MAX(ABS(val2)) AS MaxVal
FROM YourTable
GROUP BY User) t
ON y.User = t.User
AND ABS(y.Val2) = t.MaxVal
WHERE y.User = 'Fred'
Комментарии:
1. Извините, я забыл добавить предложение ‘where’. Однако, если я введу » Где y.user = Fred», я получу те же 3 возвращенные строки: 11910115 Fred 123 -0.000137 11910116 Fred 456 0 11910117 Fred 789 0.0002
2. @JonV: Моя ошибка. Вы хотели бы работать
User
вместоId
. Я обновлю ответ.3. @JonV: Рад помочь. Пожалуйста, подумайте о том, чтобы пометить этот ответ как «принятый», нажав на выделенный флажок рядом с ним.
Ответ №2:
Каждое поле, которое не является агрегированным, должно отображаться в group by . Итак, предполагая, что вы тоже хотите агрегировать val1:
Select Id, User, max(Val1) val1, max(abs(val2)) val2
From MyTable
Group By Id, User
Комментарии:
1. Это не то, чего хочет OP — ему нужно не максимальное значение для val1, а значение для val1, которое принадлежит максимальному значению для val2.
2.
max(val1)
не является желаемым результатом, основанным на ожидаемых результатах, указанных в вопросе.3. Я сделал там предположение. val1 вообще не был агрегирован, хотя он должен был быть в ожидаемых результатах. Это максимальное значение для ‘Fred’, поэтому я предположил, что это могла быть опечатка для Sue. Можно было бы изменить его на
decode (User, 'Fred', max(val1), avg(val1))
, но это тоже не имело особого смысла. 😉
Ответ №3:
select Id, User, Val1, Val2
from MyTable t1
where not exists
(
select *
from MyTable t2
where t2.Id != t1.Id
and t2.User = t1.User
and abs(t2.Val2) > abs(t1.Val2)
)
Ответ №4:
Попробуйте
SELECT t.id, t.user, t.val1, t.val2
FROM mytable t
INNER JOIN
(SELECT user, MAX(ABS(val2)) AS max
FROM mytable
GROUP BY user) q ON t.user = q.user AND ABS(t.val2)=q.max
Однако не уверен, насколько эффективно это будет на вашем столе.
Ответ №5:
select Id,
[User],
Val1,
Val2
from (
select Id,
[User],
Val1,
Val2,
row_number() over(partition by [User] order by abs(Val2) desc) as rn
from YourTable
-- where ... goes here
) as T
where rn = 1