Как я выбираю первую строку на группу в SQL-запросе?

Превратите матрицу в вектор с помощью единственного двоеточия.

x = rand(4,4);
x(:)
13
задан Jon Seigel 23 May 2010 в 02:10
поделиться

6 ответов

Просто сгруппируйте только по 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

, то есть если вы всегда хотите первое, не зная об этом

1
ответ дан 1 December 2019 в 20:43
поделиться

(ИЗМЕНИТЬ на основе отредактированного вопроса) Затем, поскольку вы хотите выполнить фильтрацию на основе значения агрегированного столбца, вам понадобится предложение 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
0
ответ дан 1 December 2019 в 20:43
поделиться

Есть ли здесь возможность использовать предложение HAVING? (Вы хотите различать агрегатную функцию - «Сумма»)?

0
ответ дан 1 December 2019 в 20:43
поделиться

Любопытно. Единственный способ заставить это работать - использовать временную таблицу хранения в памяти. (Синтаксис 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)
0
ответ дан 1 December 2019 в 20:43
поделиться

В общем, попробуйте использовать подзапросы, а не объединение и группировку - это часто делает 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)
0
ответ дан 1 December 2019 в 20:43
поделиться

Я могу не согласиться с rjmunru в том, что использование объединений в стиле Ansii часто бывает легче читать, чем подзапросы, но каждому свое - я просто следую тому, что говорят наши администраторы баз данных.

Если вы просто хотите получить первый результат запроса, вы можете использовать rownum (при использовании oracle в других базах данных, вероятно, есть что-то похожее).

select * from foo_t f где f.bar = 'bleh' и rownum = 1

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

«HAVING используется для выполнения действий с группами, созданными GROUP BY аналогично предложению WHERE для строк в базовом операторе SQL. Предложение WHERE ограничивает оцениваемые строки. Предложение HAVING ограничивает сгруппированные возвращаемые строки. "

hth

2
ответ дан 1 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: