相当于python for循环的SQL

时间:2020-08-26 21:41:01

标签: sql python-3.x sqlite

我觉得必须有一种方法可以直接在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]

2 个答案:

答案 0 :(得分:0)

请考虑在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

答案 1 :(得分:0)

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)