Sql server 选择具有匹配列2的顶部列1

Sql server 选择具有匹配列2的顶部列1,sql-server,sql-server-2008,Sql Server,Sql Server 2008,很抱歉问这个问题,但我已经没有主意了 我有这张桌子: [id] [pid] [vid] 1 4 6844 1 5 6743 2 3 855 2 6 888 ... 如何查询此eg.表以获得以下结果: [id] [pid] [vid] 1 5 6743 2 6 888 我希望获得[id]的最高[pid],

很抱歉问这个问题,但我已经没有主意了

我有这张桌子:

[id]    [pid]    [vid]
1        4        6844
1        5        6743
2        3        855
2        6        888
...
如何查询此eg.表以获得以下结果:

[id]    [pid]    [vid]
1        5        6743
2        6        888
我希望获得[id]的最高[pid],其[vid]与此[pid]匹配

有什么想法吗

我使用的是mssql 2008的单向

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
单程

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

由于您使用的是Microsoft SQL Server 2008,因此我建议您按id将结果分成多个组,并仅返回每个组中的第一行(按pid排序)。布利克的回答说明了一种方法

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


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

由于您使用的是Microsoft SQL Server 2008,因此我建议您通过id将结果划分为多个组,并仅返回每个组中的顶行(按pid排序)。布利克的回答说明了一种方法

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


使用“标准”SQL并没有一个非常好的方法来实现这一点。SqlMenage答案中显示的方法仅适用于可以将子查询用作表的数据库。例如,在SQLServer2000中,这可能是实现这一点的一种方法,但可能不适用于所有主流的RDBMS。

我将使用公共表表达式(CommonTableExpressions,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

我会使用公共表表达式(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

很抱歉剥夺了您的积分:)但是Bliek的解决方案更舒适,提供了更多的选项…很抱歉剥夺了您的积分:)但是Bliek的解决方案更舒适,提供了更多的选项…因为您的解决方案提供了更多的选项,我会给您积分!由于您的解决方案提供了更多的选项,我将告诉您重点!