Sql server SQL筛选结果集,以偶数间隔返回最大行数

Sql server SQL筛选结果集,以偶数间隔返回最大行数,sql-server,stored-procedures,Sql Server,Stored Procedures,我目前使用的是SQL2008,其中有一个存储过程,它从一个表中获取数据,然后将数据输入到客户机上的一个折线图中。此过程将from日期和too日期作为参数来筛选数据。这对于小数据集很有效,但是当输入大的日期范围时,图形会变得有点混乱 我想做的是提供要返回的记录的最大数量,并以相等间隔返回记录,以给出该数量。例如,假设我将其限制为10条记录,结果集是100条记录,我希望存储过程每隔10条记录返回一次 如果不存在重大性能问题,这是否可能?实现这一点的最佳方法是什么?我正在努力寻找一种不用光标的方法,如

我目前使用的是SQL2008,其中有一个存储过程,它从一个表中获取数据,然后将数据输入到客户机上的一个折线图中。此过程将from日期和too日期作为参数来筛选数据。这对于小数据集很有效,但是当输入大的日期范围时,图形会变得有点混乱

我想做的是提供要返回的记录的最大数量,并以相等间隔返回记录,以给出该数量。例如,假设我将其限制为10条记录,结果集是100条记录,我希望存储过程每隔10条记录返回一次

如果不存在重大性能问题,这是否可能?实现这一点的最佳方法是什么?我正在努力寻找一种不用光标的方法,如果是这样的话,我宁愿不去做


谢谢

假设您至少使用SQL2005,您可以执行以下操作

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

在final WHERE子句中选择一个值的公式与partition by子句中的%替换为/一起使用。

假设您至少使用SQL2005,您可以执行以下操作

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

在最终WHERE子句中选择一个值的公式与partition by子句中的%替换为/一起使用。

我刚刚意识到我忘记了括号,我将把它们添加到我的答案中。这可以很容易地调整为平均值,而不是过滤。将其调整为平均值的最佳方法是什么?是否要使用子查询,以便每个返回的行计算出自己的平均值?@Gavin我编辑了我的答案,以显示如何使用平均值。需要考虑的主要问题是整数的除法会导致整数的小数部分被截断。这可以用来在过去创建分区。我刚刚意识到我忘记了括号,我将把它们添加到我的答案中。这可以很容易地调整为平均值,而不是过滤。调整为平均值的最佳方法是什么?是否要使用子查询,以便每个返回的行计算出自己的平均值?@Gavin我编辑了我的答案,以显示如何使用平均值。需要考虑的主要问题是整数的除法会导致整数的小数部分被截断。这可以用来在一段时间内创建分区。您是否考虑过用平均值代替采样?使用点选择可以得到非常糟糕的结果。试想一下,通过平滑重采样生成的缩略图像与通过丢弃颗粒点生成的缩略图像。您是否考虑过使用平均值而不是采样?使用点选择可以得到非常糟糕的结果。想象一下,通过重新采样平滑而生成的缩略图与通过丢弃颗粒状点生成的缩略图。