分页表是另一个Sql问题

分页表是另一个Sql问题,sql,sql-server-2005,pagination,Sql,Sql Server 2005,Pagination,Sql Server 2005 表结构 CREATE TABLE [dbo].[Rate]( [RateID] [bigint] IDENTITY(1,1) NOT NULL, [PairID] [bigint] NOT NULL, [Open] [decimal](18, 4) NOT NULL, [Close] [decimal](18, 4) NOT NULL, [High] [decimal](18, 4) NOT NULL, [Low] [decimal](18, 4) NOT NUL

Sql Server 2005

表结构

CREATE TABLE [dbo].[Rate](
[RateID] [bigint] IDENTITY(1,1) NOT NULL,
[PairID] [bigint] NOT NULL,
[Open] [decimal](18, 4) NOT NULL,
[Close] [decimal](18, 4) NOT NULL,
[High] [decimal](18, 4) NOT NULL,
[Low] [decimal](18, 4) NOT NULL,
[Difference] [decimal](18, 4) NOT NULL,
[Average] [decimal](18, 4) NOT NULL,
[Percentage] [decimal](18, 4) NOT NULL,
[InfoDate] [datetime] NOT NULL,
[Hourly] [bit] NOT NULL,
[CaptureDateTime] [datetime] NULL,
CONSTRAINT [PK_Rate] PRIMARY KEY CLUSTERED 
(
[RateID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  =   ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
我使用分页来检索表本身

Select  * from(
SELECT
    (ROW_NUMBER()OVER (ORDER BY InfoDate ASC)) AS RowNo,
    [RateID],
    [PairID],
    [Open],
    [Close],
    [High],
    [Low],
    [InfoDate],
    [CaptureDateTime]
From Rate
) AS T
WHERE t.RowNo 
BETWEEN 200*@PageNumber AND 200 * (@PageNumber+1)-1
ORDER BY RowNo DESC
[问题] 我需要的查询将给我这个表

PageNo,StartIndex(该页中的第一个RateId),EndIndex(该页中的最后一个RateId),StartDate(该页中的第一个信息日期),EndDate(该页中的最后一个信息日期)。

类似这样的内容(未测试)

如果希望所有页面都在一个查询中,可以使用此查询

SELECT PageNo + 1 as PageNo,
       MIN(RateID) as StartIndex,
       MAX(RateID) as EndIndex,
       MIN(infoDate) as StartDate,
       MAX(infoDate) as EndDate 
FROM (
      SELECT
          (ROW_NUMBER() OVER(ORDER BY InfoDate ASC) - 1) / @PageSize AS PageNo,
          [RateID],
          [InfoDate]
      FROM Rate
     ) AS T
GROUP BY PageNo
ORDER BY PageNo

您可以尝试这样做:

DECLARE @PageSize INT = 200

;WITH PagingInfo AS
(
    SELECT
        RateID, InfoDate,
        ROW_NUMBER() OVER (ORDER BY InfoDate) AS RowNo
    FROM 
        dbo.Rate
),
Pages AS
(
    SELECT     
       RateID,
       InfoDate,
       RowNo,
       ((RowNo - 1) / @PageSize) AS PageNo
    FROM PagingInfo
)
SELECT     
    p.PageNo,
    (SELECT RateID FROM Pages p2 WHERE p2.PageNo = p.PageNo AND p2.RowNo % @PageSize = 1) AS 'First RateID',
    (SELECT RateID FROM Pages p2 WHERE p2.PageNo = p.PageNo AND p2.RowNo % @PageSize = 0) AS 'Last RateID',
    (SELECT InfoDate FROM Pages p2 WHERE p2.PageNo = p.PageNo AND p2.RowNo % @PageSize = 1) AS 'First InfoDate',
    (SELECT InfoDate FROM Pages p2 WHERE p2.PageNo = p.PageNo AND p2.RowNo % @PageSize = 0) AS 'Last InfoDate'
FROM Pages p 
WHERE p.RowNo % @PageSize = 0
这两个CTE的功能基本上与您的相同—它们为数据提供分页。第二个CTE
页面
还提供了每行的页码

从这些CTE中,我选择相关的into-页码(从
页面
),以及每页的第一个和最后一个
RateID
信息日期
。这是因为:

  • 每个页面的第一行的行号比页面大小的倍数高出1,例如1、201、401、601等-因此整数除以页面大小的剩余部分将始终为1

  • 每一页的最后一行都有一个行号,行号可以被页面大小整除(例如200、400、600等),因此整除的剩余部分是0


根据这些信息,我可以从
页面中为每页选择第一个和最后一个
RateID
InfoDate
“当底层数据发生变化时,您所寻找的数据也在不断变化。。。我可能会尝试使用视图或CTE。试图保持一个单独的表是最新的将是一个巨大的任务…对不起,我不需要一个表,我需要一个查询。
DECLARE @PageSize INT = 200

;WITH PagingInfo AS
(
    SELECT
        RateID, InfoDate,
        ROW_NUMBER() OVER (ORDER BY InfoDate) AS RowNo
    FROM 
        dbo.Rate
),
Pages AS
(
    SELECT     
       RateID,
       InfoDate,
       RowNo,
       ((RowNo - 1) / @PageSize) AS PageNo
    FROM PagingInfo
)
SELECT     
    p.PageNo,
    (SELECT RateID FROM Pages p2 WHERE p2.PageNo = p.PageNo AND p2.RowNo % @PageSize = 1) AS 'First RateID',
    (SELECT RateID FROM Pages p2 WHERE p2.PageNo = p.PageNo AND p2.RowNo % @PageSize = 0) AS 'Last RateID',
    (SELECT InfoDate FROM Pages p2 WHERE p2.PageNo = p.PageNo AND p2.RowNo % @PageSize = 1) AS 'First InfoDate',
    (SELECT InfoDate FROM Pages p2 WHERE p2.PageNo = p.PageNo AND p2.RowNo % @PageSize = 0) AS 'Last InfoDate'
FROM Pages p 
WHERE p.RowNo % @PageSize = 0