Tsql 希望在SQL Server 2012(T-SQL)中对我们的击球领先者进行排序,这是分区操作的最大结果

Tsql 希望在SQL Server 2012(T-SQL)中对我们的击球领先者进行排序,这是分区操作的最大结果,tsql,sql-server-2012-express,Tsql,Sql Server 2012 Express,我使用的是拉曼棒球数据库,我想整理一下每年YEARDID和联盟lgID的击球领袖Max average=命中率/击球率 问题是,我需要一个行号或排名,以便能够为每个yearID和lgID仅获取领先的顶级结果 到目前为止,我有以下疑问: select Concat(m.namefirst,' ', m.namelast) as Player, b.yearID, b.lgID, b.yearID-m.birthyear as Age, left(round(

我使用的是拉曼棒球数据库,我想整理一下每年YEARDID和联盟lgID的击球领袖Max average=命中率/击球率

问题是,我需要一个行号或排名,以便能够为每个yearID和lgID仅获取领先的顶级结果

到目前为止,我有以下疑问:

select
    Concat(m.namefirst,' ', m.namelast) as Player,
    b.yearID,
    b.lgID,
    b.yearID-m.birthyear as Age,
    left(round((b.h*1.000/b.ab),3),5) as Average
from
    batting b 
    inner join [master] m on b.playerID=m.playerID 
    inner join BR_WAR_2013 br on br.playerID=b.playerID and b.yearID=br.yearID
    inner join ops_plus o on b.lgID=o.lgID and b.yearID=o.yearID
    left outer join AwardsPlayersCollate a
    on b.playerID=a.playerID and b.yearID=a.yearID
where
    (b.ab + b.bb) > 500
group by
    b.yearID,b.yearID-m.birthyear,
    b.yearID,
    b.lgID,
    left(round((b.h*1.000/b.ab),3),5),
    Concat(m.namefirst,' ', m.namelast)
order by b.yearID desc,left(round(Max(b.h*1.000/b.ab),3),5) desc
其中返回以下内容:

Player            yearID    lgID    Age Average
Miguel Cabrera    2013           AL 30  0.348
Michael Cuddyer   2013           NL 34  0.331
Joe Mauer         2013           AL 30  0.324
Mike Trout        2013           AL 22  0.323
Chris Johnson     2013           NL 29  0.321
这基本上是返回2013年所有符合WHERE声明的击球平均数。 然而,我想让它为每个lgID和yearID命名top 1的领导者,然后转到2012 yearID等等

我想要这个:

Player         yearID   lgID    Age Average
Miguel Cabrera  2013    AL  30  0.348
Michael Cuddyer 2013    NL  34  0.331
Buster Posey    2012    NL  25  0.336
Miguel Cabrera  2012    AL  29  0.330
Miguel Cabrera  2011    AL  28  0.344
Jose Reyes      2011    NL  28  0.337
...
..
.
虽然我会做一个lgID的排序,以保持所有然后NL每年ID有序

根据下一条评论:是的,我试过Row_Number和Rank,这对我不起作用,但是,我可能在语法上不正确。我尝试了多种组合:

-- Trying Rank () and Row_Number() to sort out Batting Leaders
SELECT 
    Concat(m.namefirst,' ', m.namelast) as Player,
    b.yearID,
    b.lgID,
    b.yearID-m.birthyear as Age,
    left(round((b.h*1.000/b.ab),3),5) as Average,
    Rank() OVER (PARTITION BY b.lgID,b.yearID ORDER BY left(round((b.h*1.000/b.ab),3),5) DESC) AS Row
FROM
    batting b 
    inner join [master] m on b.playerID=m.playerID 
    inner join BR_WAR_2013 br on br.playerID=b.playerID and b.yearID=br.yearID
    inner join ops_plus o on b.lgID=o.lgID and b.yearID=o.yearID
    left outer join AwardsPlayersCollate a
    on b.playerID=a.playerID and b.yearID=a.yearID
WHERE (b.ab + b.bb) > 500 
ORDER BY b.yearID desc, left(round((b.h*1.000/b.ab),3),5) desc, b.lgID
得到这个:

Player          yearID  lgID    Age Average Row
Miguel Cabrera  2013    AL  30  0.348   1
Michael Cuddyer 2013    NL  34  0.331   1
Joe Mauer   2013    AL  30  0.324   2
Mike Trout  2013    AL  22  0.323   3
Chris Johnson   2013    NL  29  0.321   2
Yadier Molina   2013    NL  31  0.319   3
Freddie Freeman 2013    NL  24  0.319   3
Player         yearID   lgID    Age Average
Miguel Cabrera  2013    AL  30  0.348
Michael Cuddyer 2013    NL  34  0.331
Buster Posey    2012    NL  25  0.336
Miguel Cabrera  2012    AL  29  0.330
Miguel Cabrera  2011    AL  28  0.344
Jose Reyes      2011    NL  28  0.337
...
..
.
但是想要这个:

Player          yearID  lgID    Age Average Row
Miguel Cabrera  2013    AL  30  0.348   1
Michael Cuddyer 2013    NL  34  0.331   1
Joe Mauer   2013    AL  30  0.324   2
Mike Trout  2013    AL  22  0.323   3
Chris Johnson   2013    NL  29  0.321   2
Yadier Molina   2013    NL  31  0.319   3
Freddie Freeman 2013    NL  24  0.319   3
Player         yearID   lgID    Age Average
Miguel Cabrera  2013    AL  30  0.348
Michael Cuddyer 2013    NL  34  0.331
Buster Posey    2012    NL  25  0.336
Miguel Cabrera  2012    AL  29  0.330
Miguel Cabrera  2011    AL  28  0.344
Jose Reyes      2011    NL  28  0.337
...
..
.

使用简化的示例数据,因为您显然可以自己加入其余部分,所以应该使用秩来完成。在处理潜在关系方面,排名优于行数。如果你把你的左轮h*1.000/ab,3,5代替我简化的1.0*h/ab,它仍然有效

CREATE TABLE batting (playerID INT, yearID INT, leagueID CHAR(2), h INT, ab INT)

INSERT INTO batting 
SELECT 1, 2010, 'AL', 40, 100 UNION
SELECT 2, 2010, 'AL', 35, 100 UNION
SELECT 3, 2010, 'NL', 35, 100 UNION
SELECT 4, 2010, 'NL', 30, 100 UNION
SELECT 5, 2011, 'AL', 50, 100 UNION
SELECT 6, 2011, 'AL', 45, 100 UNION
SELECT 3, 2011, 'NL', 45, 100 UNION
SELECT 7, 2011, 'NL', 45, 100 UNION
SELECT 4, 2011, 'NL', 40, 100 

GO

;WITH cte AS (
  SELECT playerID
        ,yearID
        ,leagueID 
        ,1.0*h/ab battingAvg 
        ,RANK() OVER(PARTITION BY yearID, leagueID ORDER BY 1.0*h/ab DESC) battingRank
    FROM batting
) 
SELECT playerID
      ,yearID
      ,leagueID 
      ,battingAvg
  FROM cte 
    -- JOIN to whatever else you need
 WHERE battingRank = 1 

DROP TABLE batting

你看过等级和密集等级了吗?@Anti-weakpasswords-见上图-试过等级。。。我以前没有试过或见过稠密秩函数……我以前没有见过。我确实尝试了排名,但是,我可能没有正确地使用它。我可以通过将平均值插入击球表,然后做一个最大值,或者插入一个临时表,然后进行排序来解决所有这些问题。但我想保持桌子的原样。我不熟悉视图,它可能会起作用……为了简单起见,也许可以将原始输出用作派生表或临时表,然后将其排序或排序。或者,average可以是一个计算列。派生表:选择a.bob中的dvDerived.bob、dvDerived.alice,选择a.bob、AVGa中的alice作为a.a=b.a dvDerived上的内部联接b的alice。非常令人印象深刻。我在你的查询语句前面看到了类似的东西;有了cte,那叫什么?另外,从代码的外观来看,这可能是一种很好的实践格式,在函数中使用逗号,在函数中使用大写,在其余部分使用小写。我已经使用SQL Server大约7个月了,我一直在努力找到更好的方法来学习您在这里使用的东西。这是一个常见的表表达式CTE,名称“CTE”只是一个标识符,因为我没有选择一个更有意义的标识符。从2005年开始在SQLServer中可用,最初最容易将它们视为一种临时视图。领先;对于CTE来说有点语法上的怪癖。一个很好的介绍可以在。