Как отобразить одну строку для наименьшего номера столбца? - PullRequest
2 голосов
/ 29 января 2009

Этот вопрос сложный, поэтому примеры будут работать лучше ... У меня есть следующая таблица для ODBC, а не для управления SQL-сервером

NAME     SEQNUM     

JOHN     2          
JOHN     4
JOHN     7
MARY     12
MIKE     4
MIKE     9
PETER    7
PETER    12

Итак, я хочу получить одно имя с наименьшей последовательностью ...

NAME     SEQNUM
JOHN     2
MARY     12
MIKE     4
PETER    7

Эти данные не будут работать с SELECT (MIN(SEQNUM)). Это возвращает число. Я хочу, чтобы фактические данные помещались в мой набор данных. Кто-нибудь знает как это сделать?

Ответы [ 6 ]

14 голосов
/ 29 января 2009
select Name, MIN(SEQNUM)
from TABLE
Group By Name
3 голосов
/ 29 января 2009

Я считаю, что это то, что вы хотите:

select NAME, min(SEQNUM) as SEQNUM
from TABLE
group by NAME
2 голосов
/ 29 января 2009
SELECT TOP 1 Name, SeqNum FROM yourtable ORDER BY SeqNum DESC

Будет отображаться тот, у кого наибольшее значение SeqNum

1 голос
/ 30 января 2009

Объединение ответов Яна и Билла дает вам лучшее из обоих миров - доступ к полной записи, и нет необходимости делать потенциально очень дорогое объединение (любое объединение, которое не равнозначно, может взорвать вещи, как вы бы этого не сделали). верить).

SELECT t1.* 
FROM yourtable t1,
     (SELECT name, MIN(seqnum) as seqnum
      FROM yourtable
      GROUP BY name) t2
WHERE t1.name=t2.name
      AND t1.seqnum=t2.seqnum

Вы также можете использовать синтаксис объединения для достижения того же результата (вместо WHERE), но в этом случае я думаю, что немного яснее, что происходит, если вы используете where.

0 голосов
/ 29 января 2009

выберите имя из таблицы t, где seq_num = (выберите max (sequnum) из таблицы tt, где t.name = tt.name)

Но мне больше нравится группировка.

0 голосов
/ 29 января 2009
SELECT t1.*
FROM yourtable t1
 LEFT OUTER JOIN yourtable t2 
 ON (t1.name = t2.name AND t1.seqnum > t2.seqnum)
WHERE t2.seqnum IS NULL;

Re. Комментарий Демса:

Если вы просто используете GROUP BY name, тогда ваш список выбора может включать только name и функцию агрегирования MIN(). Часто бывает так, что вам действительно нужна вся строка, в которой минимальное значение встречается на группу.

Если вы используете решение TOP (или LIMIT, если вы используете MySQL, PostgreSQL, SQLite), то вы не можете получить минимум для нескольких групп на основе name, вы можете получить только минимум для один name.

Я прочел между строк вопроса ОП и догадался, что они хотят целую строку, что столбцов больше, чем показано в вопросе (всегда есть), и что требуемый запрос должен возвращать результаты для нескольких имен, не только один.


Re. Комментарий SquareCog:

Решение, которое вы предлагаете, также является объединением:

SELECT t1.*
FROM yourtable t1
  JOIN (SELECT name, MIN(seqnum) AS seqnum FROM yourtable GROUP BY name) t2
  USING (name, seqnum);

Однако это решение, вероятно, не может использовать индексы для оценки объединения, тогда как решение, которое я дал, может.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...