【问题标题】:SQL equivalent to python for loopSQL相当于python for循环
【发布时间】:2020-08-26 21:41:01
【问题描述】:

我觉得必须有一种方法可以直接在 SQL 中完成这个 for 循环。有人可以指导一下吗?

for x in range(1, numckts + 1, 6):
      alist.append(x)
      alist.append(x + 1)

for val in alist:
    sql = (
        "SELECT VA FROM circuits WHERE pnl_id = "
        + pnlid
        + " AND Num = "
        + str(val)
        + ";"
    )
    rows = cur.execute(sql)
    for row in rows:
        valA = valA + row[0]

【问题讨论】:

  • 解释这段python代码的目的可能会帮助SQL人员想出一个足够的答案。
  • 好的,范围是一个电路列表,这些电路在三相中一次连接到两个面板。因此,每 6 个连接发生两个。我希望这足够清楚。 LMK

标签: sql python-3.x sqlite


【解决方案1】:
select p.pnlid
, c.Num
, c.VA
from circuits c
  inner join panel p on p.pnlid = c.pnl_id
where (c.Num % 6) in (1, 2)

【讨论】:

  • 如果没有被理解,我很抱歉。我想使用 100% sql(没有 python)。我提供的 python 代码是工作代码。我只想去 sqlite 和 SQL 做计算。
  • 我认为这就是它的作用。但是您不必从某事中调用它吗?
  • 我将在答案中添加一个纯 SQL 版本。
  • 是的,我很可能会使用触发器。
  • 我看到你正在使用 SQLite。我的答案适用于 SQL Server。我认为您可能只需要将开头更改为WITH RECURSIVE。见sqlite.org/lang_with.html
【解决方案2】:

考虑 SQLite 中的 ROW_NUMBER() window function 以按顺序计算每个 pnl_id 中的行数。然后,每 6 行(即第 7 行和第 8 行)之后使用模运算符查找连接,以过滤最终聚合。

请注意:对于可能随 Python 3.8.x 一起提供的窗口函数,您需要 SQLite 版本至少为 3.25。请与sqlite3.sqlite_version联系。

WITH sub_row AS 
   (SELECT ROW_NUMBER() OVER(PARTITION BY c.pnl_id ORDER BY rowid) AS rn
           , c.pnl_id
           , c.[VA]
           , p. numckts
    FROM circuits c
    INNER JOIN panelboards p
           ON c.pnl_id = p.id)
    , 
     sub_conn AS
   (SELECT rn
           , CASE WHEN rn % 6 IN (1, 2) THEN 1 ELSE 0 END) AS conn           
           , pnl_id
           , [VA]
           , numckts
    FROM sub_row
    WHERE rn < numckts + 1)

SELECT pnl_id, SUM(VA) AS sum_VA
FROM sub_conn
WHERE conn = 1
GROUP BY pnl_id

【讨论】:

  • 如果没有被理解,我很抱歉。我想使用 100% 的 sql(不是 python)。 (我提供的 python 代码是工作代码。)我只想去 sqlite 和 SQL 来做计算。似乎没有一个简单的答案.. 似乎还有其他方法令我感到惊讶,在 SQLite 中似乎没有一种方法可以通过除 1 之外的步骤进行迭代。
  • 查看修改后的仅 SQL 答案。您需要 SQLite 3.25+ 版本才能使用窗口函数。我使用了您上述 cmets 的信息。希望它能满足您的需求。
  • 这看起来很有趣。我将它粘贴到 SQLite Studio 中,它给出了一个错误:“OVER(”处的语法需要一些时间仔细看看。
  • 检查你的SQLite版本是否支持window functions,应该是3.25+。
猜你喜欢
  • 2021-10-08
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 2021-04-02
  • 1970-01-01
  • 2018-07-28
  • 2011-06-04
相关资源
最近更新 更多