Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从…起 @乐谱 订购人 罗纳姆;_Sql Server_Tsql - Fatal编程技术网

Sql server 从…起 @乐谱 订购人 罗纳姆;

Sql server 从…起 @乐谱 订购人 罗纳姆;,sql-server,tsql,Sql Server,Tsql,同一过程的两个版本,一个按顺序输出结果集,另一个不按顺序输出 rextester链接以试用: 同一过程的两个版本,一个按顺序输出结果集,另一个不按顺序输出 rextester链接以试用: 谢谢你的回答@Charles,但我仍然不确定它是如何解决我的问题的。我试图编写的查询应该返回一组特定播放器(由其ID指定)的结果,其中包含(n)行——我可以通过将这两位数据作为函数参数传递,将其转换为可重用函数。如果我的问题没有很好地传达,或者如果我误解了你的答案,我将非常感谢你的反馈。谢谢你的回答@Char

同一过程的两个版本,一个按顺序输出结果集,另一个不按顺序输出

rextester链接以试用:

同一过程的两个版本,一个按顺序输出结果集,另一个不按顺序输出

rextester链接以试用:


谢谢你的回答@Charles,但我仍然不确定它是如何解决我的问题的。我试图编写的查询应该返回一组特定播放器(由其ID指定)的结果,其中包含(n)行——我可以通过将这两位数据作为函数参数传递,将其转换为可重用函数。如果我的问题没有很好地传达,或者如果我误解了你的答案,我将非常感谢你的反馈。谢谢你的回答@Charles,但我仍然不确定它是如何解决我的问题的。我试图编写的查询应该返回一组特定播放器(由其ID指定)的结果,其中包含(n)行——我可以通过将这两位数据作为函数参数传递,将其转换为可重用函数。如果我的问题没有很好地表达出来,或者如果我误解了你的答案,我将非常感谢你的反馈。这是为玩家5(Lou)返回6行@SqlZim谢谢。现在已经修好了。谢谢你的回答-现在可以了,但是我已经接受了@SqlZim的答案,因为我可以或多或少地使用存储过程来解决我的问题。仍然有用:)这是为玩家5(Lou)返回6行@SqlZim谢谢。现在已经修好了。谢谢你的回答-现在可以了,但是我已经接受了@SqlZim的答案,因为我可以或多或少地使用存储过程来解决我的问题。仍然有用:)很乐意帮忙@格雷厄姆·哈珀很乐意帮忙@格雷厄姆哈珀
[dbo].[PlayerScores]
ID | Name | Score
=================
1  | Bob  | 17
2  | Carl | 24
3  | Ann  | 31
4  | Joan | 11
5  | Lou  | 17
6  | Dan  | 25
7  | Erin | 33
8  | Fred | 29
SELECT RANK() OVER (ORDER BY [Score] DESC) AS [Score_Rank],
    [Name],
    [Score]
FROM [dbo].[PlayerScores]
Rank | Name | Score
=================
1    | Erin | 33
2    | Ann  | 31
3    | Fred | 29
4    | Dan  | 25
5    | Carl | 24
6    | Bob  | 17
6    | Lou  | 17
8    | Joan | 11
Rank | Name | Score
=================
1    | Erin | 33
2    | Ann  | 31
3    | Fred | 29
4    | Dan  | 25
5    | Carl | 24
Rank | Name | Score
=================
2    | Ann  | 31
3    | Fred | 29
4    | Dan  | 25
5    | Carl | 24
6    | Bob  | 17
Rank | Name | Score
=================
4    | Dan  | 25
5    | Carl | 24
6    | Bob  | 17
6    | Lou  | 17
8    | Joan | 11
with pRank(id, name, rank)
as (Select p.Id, p.Name nam,
      (Select count(*) from players
       where score <= p.score) rnk    
   from players p)
Select p.id, p.nam, p.score,
       n.id, n.nam, n.score
from pRank p join pRank n 
        on n.Rnk between 
               case when p.Rnk < @n/2 then 0 
                    else p.Rnk - @n / 2 end
           and case when p.Rnk < @n/2 then @n 
                    else p.Rnk + @n / 2 end   
order by p.rnk, p.Id, n.rnk    
declare @t table 
(id integer primary key not null,  
  nam varchar(30) not null, score int not null)   
insert @t(id, nam, score)
values
  (1, 'Bob ',17), 
  (2, 'Carl',24),
  (3, 'Ann ',31),
  (4, 'Joan',11),
  (5, 'Lou ',17),
  (6, 'Dan ',25),
  (7, 'Erin',33),
  (8, 'Fred',29)

declare @n int = 4;
with pRank(id, nam, rnk)
as (Select p.Id, p.Nam,
     (Select count(*) from @t
      where score <= p.score) rank    
from @t p)
Select p.id, p.Nam, p.rnk,
     n.id, n.nam, n.rnk
from pRank p join pRank n 
    on n.rnk between 
           case when p.rnk < @n/2 then 0 
                else p.rnk - @n / 2 end
       and case when p.rnk < @n/2 then @n 
                else p.rnk + @n / 2 end
 order by p.rnk, p.id, n.rnk        .
WITH cte AS (
SELECT RANK() OVER (ORDER BY [Score] DESC) AS [Score_Rank],
    ROW_NUMBER() OVER (ORDER BY [Score] DESC) AS [RowNum],
    COUNT(ID) OVER (PARTITION BY (Select NULL)) AS MaxRow,
    [Name],
    [Score],
    [ID]
FROM @playScores
)
SELECT Score_Rank, Name, Score
FROM
    cte
    CROSS APPLY (SELECT RowNum AS AnchorRN FROM cte WHERE ID = @playerID) tmp
WHERE
    (
    RowNum <=
    CASE WHEN tmp.AnchorRN < ((@n)/2) THEN @n
        ELSE tmp.AnchorRN + ((@n)/2) END 
    )
    AND
    (
    RowNum >=
    CASE WHEN tmp.AnchorRN > (MaxRow - (@n)/2) THEN (MaxRow -@n + 1)
    ELSE tmp.AnchorRN - ((@n)/2) END
    );

SELECT *
    , ROW_NUMBER() OVER (ORDER BY Score) AS RowNum
FROM
    @playScores
ORDER BY
    RowNum;
DECLARE @playScores TABLE (
    ID INT
    , Name NVARCHAR(50)
    , Score INT
);

INSERT INTO @playScores (ID, Name, Score)
VALUES
(1  ,' Bob  ', 17),
(2  ,' Carl ', 24),
(3  ,' Ann  ', 31),
(4  ,' Joan ', 11),
(5  ,' Lou  ', 17),
(6  ,' Dan  ', 25),
(7  ,' Erin ', 33),
(8  ,' Fred ', 29);

DECLARE @n INT = 5;
DECLARE @playerID INT =5;

SELECT *
FROM
    @playScores
ORDER BY
    Score DESC;

WITH cte AS (
SELECT RANK() OVER (ORDER BY [Score] DESC) AS [Score_Rank],
    ROW_NUMBER() OVER (ORDER BY [Score] DESC) AS [RowNum],
    COUNT(ID) OVER (PARTITION BY (Select NULL)) AS MaxRow,
    [Name],
    [Score],
    [ID]
FROM @playScores
)
SELECT Score_Rank, Name, Score
FROM
    cte
    CROSS APPLY (SELECT RowNum AS AnchorRN FROM cte WHERE ID = @playerID) tmp
WHERE
    (
    RowNum <=
    CASE WHEN tmp.AnchorRN < ((@n)/2) THEN @n
        ELSE tmp.AnchorRN + ((@n)/2) END 
    )
    AND
    (
    RowNum >=
    CASE WHEN tmp.AnchorRN > (MaxRow - (@n)/2) THEN (MaxRow -@n + 1)
    ELSE tmp.AnchorRN - ((@n)/2) END
    );

SELECT *
    , ROW_NUMBER() OVER (ORDER BY Score) AS RowNum
FROM
    @playScores
ORDER BY
    RowNum;

SELECT *
    , ROW_NUMBER() OVER (ORDER BY Score) AS RowNum
FROM
    @playScores
ORDER BY
    RowNum;
create table dbo.PlayerScores (Id int, Name nvarchar(64), Score int)
  insert into dbo.PlayerScores (Id, Name, Score) values
   (1,'Bob',17) ,(2,'Carl',24) ,(3,'Ann',31) ,(4,'Joan',11)
  ,(5,'Lou',17) ,(6,'Dan',25) ,(7,'Erin',33) ,(8,'Fred',29);
go
/* ordered resultset */
create procedure dbo.PlayerScores_getMiddle_byId (@PlayerId int, @Results int = 5) as 
begin;
  with cte as (
    select
        Score_Order = row_number() over (order by Score desc)
      , Score_Rank  = rank() over (order by Score desc)
      , Id
      , Name
      , Score
      from dbo.PlayerScores
  )
  select c.Score_Rank, c.Name, c.Score
    from (
      select top (@Results) i.* 
      from cte i 
        cross apply (select Score_Order from cte where Id = @PlayerId) as  x
      order by abs(i.Score_Order-x.Score_Order)
      ) as  c
    order by Score_Rank;
end
go
exec dbo.PlayerScores_getMiddle_byId 7,5; -- Erin
exec dbo.PlayerScores_getMiddle_byId 6,5; --Dan
exec dbo.PlayerScores_getMiddle_byId 5,5; --Lou

go
/* unordered result set */
/* 
create procedure dbo.PlayerScores_getMiddle_byId (@PlayerId int,@Results int = 5) as 
begin;
with cte as (
  select
      Score_Order = row_number() over (order by Score desc)
    , Score_Rank  = rank() over (order by Score desc)
    , Id
    , Name
    , Score
    from dbo.PlayerScores
    )

select top (@Results) c.Score_Rank, c.Name, c.Score
  from cte as c
    cross apply (select 
        Score_Order 
    from cte 
    where Id = @PlayerId) as x
    order by abs(c.Score_Order-x.Score_Order) 

end
--go
exec dbo.PlayerScores_getMiddle_byId 7,5; -- Erin
exec dbo.PlayerScores_getMiddle_byId 6,5; --Dan
exec dbo.PlayerScores_getMiddle_byId 5,5; --Lou
--*/