2010-08-27 25 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