【问题标题】:SQL query returning int column of relative orderSQL查询返回相对顺序的int列
【发布时间】:2009-02-08 13:23:45
【问题描述】:

假设我有一个包含两列的表格:姓名、年龄。

我想设计一个查询,该查询将返回按年龄排序的姓名和年龄,但还要有一个额外的列,该列将从 1 运行到 N(最后一行)。

所以对于具有以下行的表:

John, 28
Jim, 30
Mike, 28

将返回以下行

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

我该怎么做? (顺便说一句,我正在使用 MySQL,如果它有差异的话)。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    不了解 MySQL,但在 SQL Server 中你是这样操作的:

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

    在“mysql and ROW_NUMBER()”上快速谷歌搜索我发现了这个:

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

    所以大概你可以改用那个语法

    【讨论】:

      【解决方案2】:

      在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
      

      【讨论】:

        【解决方案3】:

        如果您正在寻找一种适用于任何 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-25
          • 2017-05-21
          • 1970-01-01
          • 2018-01-17
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多