Превратите матрицу в вектор с помощью единственного двоеточия.
x = rand(4,4);
x(:)
Просто сгруппируйте только по Players.Nick и выберите первое (мин.) В описании
SELECT Players.Nick, MIN(Reasons.Description), SUM(Marks.Value) AS Sum
FROM Marks INNER JOIN
Players ON Marks.PlayerID = Players.ID INNER JOIN
Reasons ON Marks.ReasonId = Reasons.ID
GROUP BY Players.Nick
ORDER BY Players.Nick, Sum DESC
, то есть если вы всегда хотите первое, не зная об этом
(ИЗМЕНИТЬ на основе отредактированного вопроса) Затем, поскольку вы хотите выполнить фильтрацию на основе значения агрегированного столбца, вам понадобится предложение Have.
SELECT p.Nick, r.Description, SUM(m.Value) Sum
FROM Marks m
JOIN Players p
ON m.PlayerID = p.ID
JOIN Reasons r
ON m.ReasonId = r.ID
GROUP BY p.Nick, r.Description
Having SUM(m.Value) =
(Select Max(Sum) From
(SELECT SUM(m.Value) Sum
FROM Marks mi
JOIN Players pi
ON mi.PlayerID = pi.ID
JOIN Reasons r i
ON mi.ReasonId = ri.ID
Where pi.Nick = p.Nick
GROUP BY pi.Nick, ri.Description))
Order By p.Nick, Sum Desc
Есть ли здесь возможность использовать предложение HAVING? (Вы хотите различать агрегатную функцию - «Сумма»)?
Любопытно. Единственный способ заставить это работать - использовать временную таблицу хранения в памяти. (Синтаксис TSQL)
-- original test data
declare @sometable table ( foo int, bar int, value int )
insert into @sometable values (1, 5, 10)
insert into @sometable values (1, 4, 20)
insert into @sometable values (2, 1, 1)
insert into @sometable values (2, 1, 10)
insert into @sometable values (2, 1, 1)
insert into @sometable values (2, 2, 13)
insert into @sometable values (3, 4, 25)
insert into @sometable values (3, 5, 1)
insert into @sometable values (3, 1, 1)
insert into @sometable values (3, 1, 1)
insert into @sometable values (3, 1, 1)
insert into @sometable values (3, 1, 1)
insert into @sometable values (3, 1, 1)
-- temp table for initial aggregation
declare @t2 table (foo int, bar int, sums int)
insert into @t2
select foo, bar, sum(value)
from @sometable
group by foo, bar
-- final result
select foo, bar, sums
from @t2 a
where sums =
(select max(sums) from @t2 b
where b.foo = a.foo)
В общем, попробуйте использовать подзапросы, а не объединение и группировку - это часто делает SQL намного проще для понимания.
SELECT Nick,
(SELECT Description from Reasons WHERE Reasons.ID = (
SELECT FIRST(Marks.ReasonId) from Marks WHERE Marks.PlayerID = Players.ID)
),
(SELECT SUM(Value) from Marks WHERE Marks.PlayerID = Players.ID)
Я могу не согласиться с rjmunru в том, что использование объединений в стиле Ansii часто бывает легче читать, чем подзапросы, но каждому свое - я просто следую тому, что говорят наши администраторы баз данных.
Если вы просто хотите получить первый результат запроса, вы можете использовать rownum (при использовании oracle в других базах данных, вероятно, есть что-то похожее).
select * from foo_t f где f.bar = 'bleh' и rownum = 1
Конечно, предложение HAVING также может быть подходящим, в зависимости от того, что вы пытаетесь сделать.
«HAVING используется для выполнения действий с группами, созданными GROUP BY аналогично предложению WHERE для строк в базовом операторе SQL. Предложение WHERE ограничивает оцениваемые строки. Предложение HAVING ограничивает сгруппированные возвращаемые строки. "
hth