【问题标题】:sql loop through each row in a tablesql循环遍历表中的每一行
【发布时间】:2015-04-14 22:00:18
【问题描述】:

我创建了一个生成股票买卖信号的程序。我还创建了测试不同信号并为每笔交易提供回报的逻辑。

下一步是在很长一段时间内模拟策略及其规则。所有信息都导出到文本文件并导入到 SQL Server 数据库中的表中。我意识到我需要声明一些变量,例如StartCapitalCurrentCapitalNumberOfPositionsPositionsLeft。其中一列名为 BuyPrice 并指示何时购买以及以哪个价格购买,发生这种情况时应将 NumberOfPositions 减去 1。

SellPrice 列表示何时出售以及以哪个价格出售,何时发生这种情况NumberOfPositions 需要加一。 NumberOfPositions 的最大值应为 5,最小值应为 0。所需的结果是查看 CurrentCapital 的展开方式。

我非常感谢任何输入和某种 SQL 代码来启动表单。

【问题讨论】:

  • 无法真正描绘出您所追求的内容,但要回答主题行中的问题,您需要使用 CURSOR 遍历表中的行。
  • 同意你的问题很不清楚。但是,从伪解释来看,我建议您不需要或不需要光标。您应该能够使用基于集合的方法来做到这一点。

标签: sql sql-server simulation


【解决方案1】:

根据您的问题说明。这是我使用TABLE 类型的变量循环遍历表的每一行的方式:

DECLARE
    @counter    INT = 1,
    @max        INT = 0

-- Declare a variable of type TABLE. It will be used as a temporary table.
DECLARE @myTable TABLE (
    [Id]        int identity,
    [Column1]   nvarchar(max),
    [Column2]   nvarchar(100)
)

-- Insert your required data in the variable of type TABLE
INSERT INTO @myTable
SELECT Column1, Column2
FROM [dbo].[YOUR_DATABASE_TABLE]

-- Initialize the @max variable. We'll use thie variable in the next WHILE loop.
SELECT @max = COUNT(ID) FROM @myTable

-- Loop 
WHILE @counter <= @max
BEGIN

    -- Do whatever you want with each row in your table variable filtering by the Id column
    SELECT Column1, Column2
    FROM @myTable
    WHERE Id = @counter

    SET @counter = @counter + 1
END

【讨论】:

  • 自从我上次用 SQL 编码以来已经很久了 - 感谢模板
【解决方案2】:

还有另一种循环方式。我已经看到很多答案将计数器加 1。但是,根据我的经验,不能保证您在数据集中的 id 不会有间隙。

这是我经常使用的一个解决方案:

declare @idColumn int

select @idColumn = min( TableID ) from Table

while @idColumn is not null
begin
    /*
        Do all the stuff that you need to do
    */
    select @idColumn = min( TableID ) from Table where TableID > @idColumn
end

【讨论】:

  • 你需要让增量语句成为一个选择语句吗?或者你可以简单地设置@idColumn = 吗?
  • @Rfjt 不,我认为它不需要是一个选择语句。它可以以任何适合您需要的方式进行设置。
  • 很好的查询。太棒了!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多