Tsql 希望在SQL Server 2012(T-SQL)中对我们的击球领先者进行排序,这是分区操作的最大结果
我使用的是拉曼棒球数据库,我想整理一下每年YEARDID和联盟lgID的击球领袖Max average=命中率/击球率 问题是,我需要一个行号或排名,以便能够为每个yearID和lgID仅获取领先的顶级结果 到目前为止,我有以下疑问: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(
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来说有点语法上的怪癖。一个很好的介绍可以在。