SQL-запрос, возвращающий столбец int относительного порядка - PullRequest
0 голосов
/ 08 февраля 2009

Скажем, у меня есть таблица с двумя столбцами: Имя, Возраст.

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

Так для таблицы со следующими строками:

John, 28
Jim, 30
Mike, 28

Будут возвращены следующие строки

John, 28, 1
Mike, 28, 2
Jim, 30, 3

Как я могу это сделать? (Я использую MySQL, кстати, если он делает diff).

Ответы [ 3 ]

4 голосов
/ 08 февраля 2009

Не знаю о MySQL, но в SQL Server вы делаете это так:

SELECT Name, Age, ROW_NUMBER() OVER (ORDER BY AGE) AS RunningCount
FROM MyTable

Быстрый поиск в Google по "mysql and ROW_NUMBER ()", я нашел это:

set @num = 0;
select *, @num := @num + 1 as row_number from TABLE

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

1 голос
/ 08 февраля 2009

В MySQL вы можете:

SELECT Row,Name,Age
FROM (SELECT @row := @row + 1 AS Row, Name,Age FROM table1 ) 
As derived1

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

   select rank=count(*), a1.name, a1.age
   from table1 a1, table1 a2
   where a1.name >= a2.name
   group by a1.name , a1.age
   order by rank
0 голосов
/ 08 февраля 2009

Если вы ищете универсальный метод, который должен работать на любой платформе SQL, должно работать следующее. Я никогда не использовал его на очень большом столе, поэтому я не знаю, какова будет производительность. Кроме того, если ваше имя и возраст могут совпадать в двух строках, вы получите дубликат числа (например, 1, 2, 3, 3, 5 ...). Вы можете избежать этого, если захотите, добавив туда PK или другой набор столбцов, которые гарантированно будут уникальными.

SELECT
     T1.name,
     T1.age,
     COUNT(T2.name) + 1
FROM
     My_Table T1
LEFT OUTER JOIN My_Table T2 ON
     T2.age < T1.age OR
     (
          T2.age = T1.age AND
          T2.name < T1.name
     )
GROUP BY
     T1.name,
     T2.age
ORDER BY
     T1.age,
     T2.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...