【问题标题】:Paging Table Another Sql Question分页表另一个Sql问题
【发布时间】:2013-10-27 19:04:18
【问题描述】:

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(该页面中的第一个 infoDate),EndDate(该页面中的最后一个 infoDate)。

【问题讨论】:

  • 您正在寻找的这个 *table" 不断变化,当基础数据发生变化时......我可能会尝试使用视图或 CTE。尝试保持单独的表迄今为止将是一项艰巨的任务....
  • 对不起,我不需要表格,我需要查询。

标签: sql sql-server-2005 pagination


【解决方案1】:

你可以尝试做这样的事情:

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 Pages 额外提供每行的页码。

从这些 CTE 中,我选择相关的页码(来自Pages),以及每页的第一个和最后一个RateIDInfoDate。这是因为:

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

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

根据这些信息,我可以从Pages CTE 中为每个页面挑选出第一个和最后一个RateIDInfoDate

【讨论】:

    【解决方案2】:

    类似的东西(未经测试)。

    SELECT @PageNumber 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)) AS RowNo,
              [RateID],
              [InfoDate]
          FROM Rate
         ) AS T
    WHERE t.RowNo BETWEEN 200*@PageNumber AND 200 * (@PageNumber+1)-1
    

    如果您想要一个查询中的所有页面,您可以改用它。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2012-06-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      相关资源
      最近更新 更多