在条件之间按指定顺序执行SQL顺序

在条件之间按指定顺序执行SQL顺序,sql,tsql,Sql,Tsql,这是选择8条记录的分页查询的一部分: SELECT * FROM #Results WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1 ORDER BY ad_type ASC,NEWID() 但首先选择8条记录,然后按它们排序 我想先按所有记录排序,然后在下一页获取中选择8条下一个记录,而不复制任何记

这是选择8条记录的分页查询的一部分:

 SELECT * FROM #Results  
        WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1 
 ORDER BY ad_type ASC,NEWID()
但首先选择8条记录,然后按它们排序

我想先按所有记录排序,然后在下一页获取中选择8条下一个记录,而不复制任何记录

这是我的第一页结果:

这是第二页的结果:

在第二页中有一条ad_类型为2的记录,该记录应位于第一页,而不是第一页结果中的最后一条记录

这就是我的全部程序:

GO
    ALTER PROCEDURE [dbo].[GetAdPageWise]  
        @PageIndex INT = 1  
       ,@PageSize INT = 3  
       ,@PageCount INT OUTPUT  

       ,@state_id int=NULL
    AS  
    BEGIN  
          SET NOCOUNT ON;  

SELECT  Id,ROW_NUMBER() OVER  
            (  
                  ORDER BY Id   
            )AS RowNumber 
      ,ad_title
      ,ad_brief  
      ,ad_pic
      ,ad_type    
INTO #Results
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY a.ID) AS rn, a.Id
      ,a.ad_title
      ,a.ad_brief  
      ,a.ad_pic
      ,a.ad_type    
    FROM [tbl_ads] a LEFT JOIN tbl_inf_adstate b ON a.Id=b.ad_id 
    WHERE (b.state_id=@state_id OR @state_id IS NULL) 
    AND a.ad_is_accept=1 
    AND a.ad_is_show=1 
    AND a.ad_is_slide=0 
)x
WHERE rn = 1


          DECLARE @RecordCount INT  
        SELECT @RecordCount = COUNT(*) FROM #Results  

          SET @PageCount = CEILING(CAST(@RecordCount AS DECIMAL(10, 2)) / CAST(@PageSize AS DECIMAL(10, 2)))  
        PRINT       @PageCount  

        SELECT * FROM #Results  
        WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1  ORDER BY ad_type ASC,NEWID()

        DROP TABLE #Results  
    END

我该怎么做呢?

听起来你想同时显示某一特定广告类型的所有广告,所以你应该先按此顺序订购。我假设这是基于显示的结果,没有重复,但第一批是1,45之间的ad_id,第二批是46,58

要做到这一点,只需更改以下行,不需要分区依据,因为我们只想创建一个从1到n的长长的行号列表:

SELECT ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY a.ID) AS rn, a.Id
致:

但我确实看到了查询中需要指出的一些其他问题:

使用上面介绍的解决方案,它假定数据不会在您下方发生变化。假设只添加了行,并且ad_id总是在增加,这在以前不是什么问题,但是现在我们先按ad_类型排序,然后按ad_id排序,这可能会更大,如果需要,应该加以考虑。 为了确保联接的逻辑中没有错误,您应该在tbl_inf_adstate.ad_id上放置一个唯一的约束,否则您需要更改联接,因为它会在结果中复制来自tbl_ads的行。 如果您使用的是SQL Server 2012或更高版本,则可能需要
你太晚了。行号必须已经被订购,否则它是非常无用的:您需要将您想要的订购添加到行号中,而不是order by。。。用于创建结果的子句。假设您首先确实需要结果:我需要样本数据、所需结果和整个查询来帮助您。@Stephan我编辑了我的问题。您的排序条件是不确定的-即使没有筛选,您也不能保证两次运行的查询会对行进行相同的排序。在对其余部分进行排序之前,您首先需要选择一些确定的排序标准-去掉newid。您必须在数据中标识足够多的列,以便每一行在这些列中始终具有唯一的值,而不是当前多行具有相同ad_类型值的情况。然后,您需要在排序/分页逻辑中包含所有这些列。
SELECT ROW_NUMBER() OVER (ORDER BY a.ad_type, a.ID) AS rn, a.Id
    SELECT a.Id
          ,a.ad_title
          ,a.ad_brief  
          ,a.ad_pic
          ,a.ad_type    
     FROM [tbl_ads] a 
     LEFT JOIN tbl_inf_adstate b 
       ON a.Id = b.ad_id 
      AND a.ad_is_accept=1 
      AND a.ad_is_show=1 
      AND a.ad_is_slide=0
    WHERE b.state_id = @state_id 
       OR @state_id IS NULL             
    order by a.ad_type, a.Id 
   OFFSET (@PageIndex -1) * @PageSize ROWS 
    FETCH NEXT @PageSize ROWS ONLY;