【问题标题】:How to write loop in Microsoft Cosmos Scope to process row by row?如何在 Microsoft Cosmos Scope 中编写循环以逐行处理?
【发布时间】:2018-06-01 04:27:45
【问题描述】:

更新:我想做的一个例子:

现有表:

1st Table name: DistinctAcctDay;
Column name: ID int, AccountingDate datetime;
Values: (1, 2017/05/01);
     (2, 2017/08/01);
     (3, 2017/09/01);


2nd Table name: TransferOut;
Column name: AccountingDate datetime; Amount decimal;
Values: (2017/01/01, 10);
(2017/02/01, 13);
(2017/06/25, 15);
(2017/08/03, 18);
(2017/08/08, 30);

我想让 Cosmos 脚本返回低于 3(或 n,取决于第一个表中存在多少行)的输出,输出当天之前所有历史数据的总和:

1) 第一表 2017/05/01 之前日期第二表的总和:数字应为 23;

2)第一表2017/08/01之前日期的第二表总和:数字应为10+13+15 =38;

3)第一表2017/09/01之前日期的第二表总和:数字应为10+13+15+18+30=86;

脚本应该用 Cosmos 编写。

感谢大家的帮助。

//////////////////////

我的想法:

我正在考虑遍历第一个表并每次选择一行(一个日期),并使用该日期作为从第二个表中获取数据的标准。

如果用 sql 编写,它可能如下所示。

Declare @Counter int,@MaxRowLimit int; 
Set @Counter =1;
Set @MaxRowLimit = (SELECT COUNT(*) FROM DistinctAcctDay);
WHILE @Counter <= @MaxRowLimit
BEGIN
  PickAcctDay=
  SELECT AccountingDay
  FROM DistinctAcctDayId
  WHERE ID =@Counter;

  TransferOut =
     SELECT SUM(Amount) FROM TransferOut
     WHERE AccountingDate <= PickAcctDay;   
   SET @Counter =@Counter +1
END

但是它需要用 USQL 编写,我对 USQL 和 C# 都不熟悉。我写了下面这样的东西(这是不正确的),我被卡住了......

int counter=1; int MaxRowLimit;
for (counter = 1; counter <= MaxRowLimit; counter++)
{
  DateTime PickAcctDay =
  SELECT AccountingDay
  FROM DistinctAcctDayId
  WHERE ID ==@Counter;

  TransferOut =
     SELECT SUM(Amount) FROM TransferOut
     WHERE AccountingDate <= PickAcctDay;
}

【问题讨论】:

  • 这是 XY 问题的一个典型例子。 xyproblem.info
  • 嗨,肖恩,我在上面更清楚地编辑了我的原始问题/场景,请随时查看和建议。谢谢!
  • 为什么要包括“原始问题”?它只会增加噪音并使您的问题难以理解。
  • 即使您的 SQL 解决方案也是一个糟糕的解决方案。 SQL 是一种转换和组合行集的声明性语言。所以你需要从语言代数的角度来思考,而不是试图把它硬塞进一个不同的范式。大卫为您的问题提供了正确的答案。如果您将其标记为这样,那就太好了。

标签: c# u-sql cross-join cosmos


【解决方案1】:
@DistinctAcctDay = 
SELECT * FROM 
    ( VALUES
    (1, new DateTime(2017,05,01)),
    (2, new DateTime(2017,08,01)),
    (3, new DateTime(2017,09,01))
    ) AS T(Id, AccountingDate);


@TransferOut = 
SELECT * FROM 
    ( VALUES
    (new DateTime(2017,01,01), 10),
    (new DateTime(2017,02,01), 13),
    (new DateTime(2017,06,25), 15),
    (new DateTime(2017,08,03), 18),
    (new DateTime(2017,08,08), 30)
    ) AS T(AccountingDate, Amount);

@result = 
       SELECT d.Id, SUM(Amount) AS sumAmount
       FROM  @DistinctAcctDay AS d
       CROSS JOIN @TransferOut AS t
       WHERE d.AccountingDate >= t.AccountingDate 
      // WHERE d.AccountingDate BETWEEN t.AccountingDate AND d.AccountingDate
       GROUP BY d.Id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2016-09-06
    • 2010-09-24
    相关资源
    最近更新 更多