2011-09-12 52 views
2

SQL Server 2005中分頁表另一個SQL問題

表結構

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(first RateId in that EndIndex(該頁面中的最後RateId),StartDate(該頁面中的第一個infoDate),EndDate(該頁面中的最後一個infoDate)。

+0

你正在尋找的這個* table是不斷變化的,當底層數據在改變的時候......我可能會嘗試使用一個視圖或一個CTE來代替,試着讓一個單獨的表保持最新狀態將會是巨大的任務.... –

+0

對不起,我不需要一個表,我需要一個查詢。 – thewayman

回答

2

你可以嘗試做這樣的事情:

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