代码之家  ›  专栏  ›  技术社区  ›  Andreas Niedermair

选择顶部列1和匹配列2

  •  0
  • Andreas Niedermair  · 技术社区  · 16 年前

    很抱歉问这个问题,但我没办法了

    我有这张桌子:

    [id]    [pid]    [vid]
    1        4        6844
    1        5        6743
    2        3        855
    2        6        888
    ...
    

    如何查询此eg.table以获得以下结果:

    [id]    [pid]    [vid]
    1        5        6743
    2        6        888
    

    我想得到[id]的最高[pid],其中[vid]与此[pid]匹配

    有什么想法吗?

    我正在使用MSSQL2008

    3 回复  |  直到 16 年前
        1
  •  1
  •   Bliek    16 年前

    我将使用公共表表达式(CTE)。这提供了很多可能性,比如:

    WITH Result (RowNumber, [id], [pid], [vid])
    AS
    (
        SELECT Row_Number() OVER (PARTITION BY [id]
                                  ORDER     BY [vid] DESC)
              ,[id]
              ,[pid]
              ,[vid]
          FROM MyTable
    )
    SELECT [id]
          ,[pid]
          ,[vid]
      FROM Result
     WHERE RowNumber = 1
    
        2
  •  4
  •   SQLMenace    16 年前

    单程

    select t1.* from
    (select id,max(pid) as Maxpid
    from yourtable
    group by id) t2
    join yourtable t1 on t2.id = t1.id
    and t2.Maxpid = t1.pid
    
        3
  •  1
  •   Sixten Otto    16 年前

    既然您使用的是Microsoft SQL Server 2008,那么我建议您 Common Table Expressions the OVER clause 完成将结果分组 身份证件 ,并返回每组中的第一行(按 PID )布利克的回答显示了一种方法。

    (顺便说一下,同样的基本方法对于更高效的分页也非常有用。)

    对于“标准”SQL,没有一种非常好的方法可以做到这一点。sqlmanace答案中显示的方法只能在数据库中使用,在数据库中可以将子查询用作表。例如,这是在SQL Server 2000中实现这一点的一种方法,但可能不适用于每个主流RDBMS。