C# 选择顶部和SQL中的选定行
我有一个有3000名参赛者的联盟。我想做的是只选择其中的50个,但如果用户不在前50名中,我还想选择该行并显示其当前位置,下面的查询显示我正在从主内部查询中选择前50名位置,该查询将返回所有玩家及其位置。现在我想显示当前登录的用户及其位置,那么有没有办法通过修改以下内容从子集中选择前50名和用户条目?即,是否可以在一个子集上运行两次选择,如C# 选择顶部和SQL中的选定行,c#,sql,sql-server,C#,Sql,Sql Server,我有一个有3000名参赛者的联盟。我想做的是只选择其中的50个,但如果用户不在前50名中,我还想选择该行并显示其当前位置,下面的查询显示我正在从主内部查询中选择前50名位置,该查询将返回所有玩家及其位置。现在我想显示当前登录的用户及其位置,那么有没有办法通过修改以下内容从子集中选择前50名和用户条目?即,是否可以在一个子集上运行两次选择,如 SELECT TOP 50 AND SELECT TOP 1 (Where condition) FROM ( Subset ) 我的问题 S
SELECT TOP 50 AND SELECT TOP 1 (Where condition)
FROM
(
Subset
)
我的问题
SELECT TOP 50 [LeagueID],
[EntryID],
[UserID],
[TotalPoints],
[TotalBonusPoints],
[TotalPointsLastEvnet],
[TotalBonusPointsLastRaceEvent],
[Prize],
[dbo].[GetTotalPool]([LeagueID]) AS [TotalPool],
DENSE_RANK() OVER( PARTITION BY [LeagueID] ORDER BY [TotalPoints] DESC, [TotalBonusPoints] DESC) AS [Position],
DENSE_RANK() OVER( PARTITION BY [LeagueID] ORDER BY [TotalPointsLastRace] DESC, [TotalBonusPointsLastRace] DESC) AS [PositionLastRace]
FROM
(
// inner query here bringing back all entrants
) AS DATA
可以使用union连接两个结果子集: 此外,如果需要从同一suset填充结果,则可以使用公共表表达式: pseodocode:
with subset(...)
select top 50
union
select top 1
您可以使用CTE而不是子查询,然后选择TOP 50,然后选择TOP 1并合并所有类似的内容
;WITH CTE AS
(
// inner query here bringing back all entrants
)
SELECT TOP 50 * FROM CTE WHERE <Some Codition>
UNION ALL
SELECT TOP 1 * FROM CTE WHERE <Some other Codition>
请尝试以下操作:
;WITH entrants
([LeagueID],[EntryID],[UserID],[TotalPoints],[TotalBonusPoints],[TotalPointsLastEvnet],
[TotalBonusPointsLastRaceEvent],[Prize],[TotalPool],[Position],[PositionLastRace])
AS
(
SELECT [LeagueID],
[EntryID],
[UserID],
[TotalPoints],
[TotalBonusPoints],
[TotalPointsLastEvnet],
[TotalBonusPointsLastRaceEvent],
[Prize],
[dbo].[GetTotalPool]([LeagueID]) AS [TotalPool],
DENSE_RANK() OVER( PARTITION BY [LeagueID] ORDER BY [TotalPoints] DESC, [TotalBonusPoints] DESC) AS [Position],
DENSE_RANK() OVER( PARTITION BY [LeagueID] ORDER BY [TotalPointsLastRace] DESC, [TotalBonusPointsLastRace] DESC) AS [PositionLastRace]
FROM
(
// inner query here bringing back all entrants
) AS DATA
)
SELECT TOP 50 * FROM entrants
UNION
SELECT * FROM entrants WHERE UserID = @current_userid
ORDER BY Position;
你可以不用工会来做这件事。您只需要或:
这将使用行号来执行您希望top执行的操作。我注意到您的问题不包括order by子句,因此我猜您希望按职位排序。对不起,SQL Server女士,前50名的联合查询加上您想要的可能是最好的方法。
WITH data as (
// inner query here bringing back all entrants
)
SELECT * -- or whatever columns you really want
FROM (SELECT data.*
DENSE_RANK() OVER (PARTITION BY [LeagueID]
ORDER BY [TotalPoints] DESC, [TotalBonusPoints] DESC
) AS [Position],
DENSE_RANK() OVER (PARTITION BY [LeagueID]
ORDER BY [TotalPointsLastRace] DESC, [TotalBonusPointsLastRace] DESC
) AS [PositionLastRace],
ROW_NUMBER() OVER (PARTITION BY [LeagueID]
ORDER BY [TotalPoints] DESC, [TotalBonusPoints] DESC
) as Position_Rownum
FROM data
) d
WHERE Position_RowNum <= 50 or UserId = @Current_userid