当前位置: 首页 > 面试题库 >

SQL Server:如何选择固定数量的行(选择每个第x个值)

刘令
2023-03-14
问题内容

简短说明:我有一个表,其中包含在特定时间段内更新的数据。现在的问题是,根据发送数据的传感器的性质,在此时间段内可能有50个数据集或50.000个数据集。当我想可视化此数据(使用ASP.NET
/ c#)时,对于第一次预览,我想从表中仅选择1000个值。

我已经有一种方法可以执行此操作:我可以在感兴趣的时间段中对行进行计数,并使用简单的“ where”子句来指定sensor-
id,将其保存为SQL中的变量,然后将count()除以1000我已经在MS Access中尝试过了,它在这里工作得很好:

set @divider = select count(*) from table where [...]

SELECT (Int([RowNumber]/@divider)), First(Value)
FROM myTable
GROUP BY (Int([RowNumber]/@divider));

Access的窍门是,我只拥有一个数据字段(“ RowNumber”),它是我的PK /
ID,从0开始。我试图使用该ROW_NUMBER()方法在SQL
Server中完成该任务,该方法或多或少地起作用。我已经为该方法使用了正确的语法,但是我无法使用该GROUP BY语句

窗口函数只能出现在SELECT或ORDER BY子句中。

含义ROW_NUMBER()不能出现在GROUP BY语句中。

现在我有点卡住了。我试图将ROW_NUMBER值保存到char或单独的列中,GROUP BY以后再保存,但无法完成。我开始以某种方式开始思考,我的策略可能有其弱点…?:/

再次澄清一下:我不需要SELECT TOP 1000从表中删除,因为这仅意味着我选择了前1000个值(取决于排序)。我需要SELECT每个第x个值,而我可以计算x(并且甚至可以将它四舍五入为INT,如果这样做可以帮助完成它)。我希望我能够描述可理解的问题…

这是我在StackOverflow上的第一篇文章,希望您不要忘记任何必不可少或重要的内容,如果您需要任何其他信息(表结构,到目前为止的查询,…),请随时提出。任何帮助或提示,我们将不胜感激-
预先感谢!:)

更新:解决方案!非常感谢https://stackoverflow.com/users/52598/lieven
!!!

这是我最后做的事情:

我声明2个变量-
我计算行数并将其设置到第一个变量中。然后,我在刚分配的变量上使用ROUND(),并将其除以1000(因为最后我想要大约1000个值!)。我将此操作分为2个变量,因为如果我使用COUNT函数的值作为ROUND操作的基础,则会出现一些错误。

declare @myvar decimal(10,2) 
declare @myvar2 decimal(10,2)

set @myvar = (select COUNT(*)
from value_table
where channelid=135 and myDate >= '2011-01-14 22:00:00.000' and myDate <= '2011-02-14 22:00:00.000'
)

设置@ myvar2 = ROUND(@ myvar / 1000,0)

现在,我有一个四舍五入的值,我想将其作为步长(取每个第x个值->这是我们的“ x”;))存储在@
myvar2中。接下来,我将子选择所需时间跨度和通道的数据,并将ROW_NUMBER()添加为“
rn”列,最后向外部SELECT添加WHERE子句,在该行中,通过@ myvar2将ROW_NUMBER除以-模数为0,将选择该行。

select * from
(
select (ROW_NUMBER() over (order by id desc)) as rn, myValue, myDate
from value_table
where channel_id=135 and myDate >= '2011-01-14 22:00:00.000' and myDate<= '2011-02-14 22:00:00.000'
) d
WHERE rn % @myvar2 = 0

就像魅力一样工作-
再次感谢https://stackoverflow.com/users/52598/lieven,请参阅下面的评论以获取原始帖子!


问题答案:

本质上,选择第x个值所需要做的就是保留所有行数除以x的模数为0的行。

WHERE rn % @x_thValues = 0

现在,要使用ROW_NUMBER的结果,您需要将整个语句包装到一个subselect中

SELECT  *
FROM    (
            SELECT  *
                    , rn = ROW_NUMBER() OVER (ORDER BY Value)
            FROM    DummyData
        ) d
WHERE   rn % @x_thValues = 0

结合变量到需要的第x个值,您可以使用类似于以下的testscript

DECLARE @x_thValues INTEGER = 2

;WITH DummyData AS (SELECT * FROM (VALUES (1), (2), (3), (4)) v (Value))
SELECT  *
FROM    (
            SELECT  *
                    , rn = ROW_NUMBER() OVER (ORDER BY Value)
            FROM    DummyData
        ) d
WHERE   rn % @x_thValues = 0


 类似资料:
  • 问题内容: 我有一个生成的DataFrame,如下所示: 结果如下: 如您所见,DataFrame按升序排列,然后按降序排列。 我想选择每个组的第一行,即 从小时== 0的组中选择(0,cat26,30.9) 从小时= 1的组中选择(1,cat67,28.5) 从小时== 2的组中选择(2,cat56,39.6) 等等 因此,所需的输出将是: 能够选择每个组的前N行也可能很方便。 任何帮助都将受到

  • 问题内容: 我有这张桌子: 假设我有500行,我想为每个feed_id选择3个条目吗?和50作为总限制。 怎么写这个SQL? 问题答案: 使用: 还不清楚要返回什么的详细信息-表中的所有行,或仅是feedid。

  • 问题内容: 在C#中将是这样的: Linq-To-Sql将其转换为以下T-SQL代码: 但是它与MySQL不兼容。 问题答案: 当我写 有用。在其他RDBMS中,IIRC这样的语句是不可能的,因为不属于任何组合键的不属于分组键的列就被引用了。 这种“怪癖”的行为与我想要的行为非常接近。所以我用它来获得想要的结果:

  • 问题内容: 我正在努力寻找以下问题的最佳解决方案。假设我有一个像这样的表“ Table”: 我想为集合中的每个值选择:(’name1’,’name2’)10个随机唯一行。当然,可以像这样进行联合: 但是,如果我有100个唯一的名称,而我必须为其选择10个随机记录,则此查询将有点大。 提前非常感谢 问题答案: SQLFiddle演示

  • 问题内容: 我有这个SQL查询: 这将导致类似于以下的输出: 我想每个Foo仅保留第一行,而忽略其余的行。 我怎么做? 问题答案:

  • 问题内容: 如标题所示,我想选择以分组的每组行的第一行GROUP BY。 具体来说,如果我有一个purchases看起来像这样的表: 我的输出: 我想查询每个人id最大的购买金额(total)customer。像这样的东西: Expected Output: 问题答案: 在PostgreSQL中,这通常更简单,更快捷(下面将进行更多性能优化): 或更短(如果不太清楚),输出列的序号为: 如果tot