說我有兩列的表:名稱,年齡。SQL查詢返回int列的相對順序
我想設計一個查詢,將返回按年齡排序的名稱和年齡,但也有一個額外的列將從1到N(最後一行)運行。
因此,對於具有以下行的表:
John, 28
Jim, 30
Mike, 28
以下行將返回
John, 28, 1
Mike, 28, 2
Jim, 30, 3
我怎樣才能做到這一點? (我使用MySQL,順便說一句,如果它使差異)。
說我有兩列的表:名稱,年齡。SQL查詢返回int列的相對順序
我想設計一個查詢,將返回按年齡排序的名稱和年齡,但也有一個額外的列將從1到N(最後一行)運行。
因此,對於具有以下行的表:
John, 28
Jim, 30
Mike, 28
以下行將返回
John, 28, 1
Mike, 28, 2
Jim, 30, 3
我怎樣才能做到這一點? (我使用MySQL,順便說一句,如果它使差異)。
在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
不知道MySQL,但是在SQL Server你做這種方式:
SELECT Name, Age, ROW_NUMBER() OVER (ORDER BY AGE) AS RunningCount
FROM MyTable
的 「MySQL和ROW_NUMBER()」 我發現這是一個快速谷歌搜索:
set @num = 0;
select *, @num := @num + 1 as row_number from TABLE
那麼想必你可以使用,而不是語法
如果您正在尋找一種適用於任何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