2010-08-27 27 views
0

我當前使用SQL2008,其中存儲過程從表中獲取數據,然後將表提供給客戶端上的線圖。此過程從過濾日期和過濾日期作爲參數來過濾數據。這適用於小數據集,但在輸入較大日期範圍時圖表會變得有點混亂,導致結果連續出現。SQL篩選結果集以最小間隔返回行數

我想要做的是提供一個最大數量的記錄被返回並以均勻間隔返回記錄來給出這個數量。例如說,我將它限制爲10條記錄,結果集爲100條記錄,我希望存儲過程每10條記錄返回一次。

這可能沒有遭受重大性能問題,什麼是實現它的最佳方式?我努力找到一種不用光標的方法,如果那樣的話,我寧願不做。

感謝

+0

您是否考慮過平均而不是採樣?您可以通過點選來獲得非常棘手的結果。想想通過重新採樣(光滑)製作的縮略圖圖像與通過丟棄點(顆粒感)製作的縮略圖圖像。 – ErikE 2010-08-28 01:21:29

回答

2

假設你使用至少SQL2005,你可以做somesting像

WITH p as (
    SELECT a, b, 
      row_number() OVER(ORDER BY time_column) as row_no, 
      count() OVER() as total_count 
     FROM myTable 
     WHERE <date is in range> 
    ) 
SELECT a, b 
    FROM p 
WHERE row_no % (total_cnt/10) = 1 

的地方在底部狀態的記錄由分割總數計算行數的模所需的最終記錄數量。 WHERE子句與%更換使用

WITH p as (
    SELECT a, b, 
      row_number() OVER(ORDER BY time_column) as row_no, 
      count() OVER() as total_count 
     FROM myTable 
     WHERE <date is in range> 
    ), 
    a as (
    SELECT a, b, row_no, total_count, 
      avg(a) OVER(partition by row_no/(total_cnt/10)) as avg_a 
     FROM p 
    ) 
SELECT a, b, avg_a 
    FROM a 
WHERE row_no % (total_cnt/10) = 1 

的公式選擇在最後的一個值:

如果你想使用的平均水平,而不是一個特定的值,你可以按如下方式擴展該在分區by子句中由/表示。

+0

邪惡完全忘了row_number謝謝 – Gavin 2010-08-27 08:48:19

+0

我剛剛意識到我忘記了括號,我會將它們添加到我的答案中。 – Frank 2010-08-27 08:50:50

+0

這可以很容易地適應平均而不是過濾。 – ErikE 2010-08-28 01:21:54