You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite与Python查询问题:获取唯一IDFrom对应的kV及VoltMag数据

SQLite与Python查询问题:获取唯一IDFrom对应的kV及VoltMag数据

我正在用SQLite搭配Python处理数据库,现在需要从一张数据表中提取唯一的IDFrom值、对应的kV和VoltMag字段,不需要其他列的信息。我尝试写了几个查询函数,但没能得到预期的唯一结果,希望能得到大家的帮助。

下面是我的数据表结构和数据:

IDFromTypekVVoltMagIDToLFMW
LVBusLoad0.4799999997.353271484375Sub3 Swgr-0.476513087749481
LVBus000Bus50.123355090618134
Main BusSwng34.5100Sub2A3.65306186676025
Main Bus000Sub2B-1.56734025478363
Main BusXF3W00Sub 30
Sub2ALoad13.800000190734999.2764282226562Bus72.71204876899719
Sub2A000Main Bus1.79826784133911
Sub2BGen13.8000001907349101Bus61.79826784133911
Sub2B000Sub 31.6838458776474
Sub2BXF3W00Main Bus0
Sub22Load3.4500000476837296.6335220336914Bus7-2.69958877563477
Sub23Load3.45000004768372100.332984924316Bus23A0.524362742900848
Sub23000Bus6-1.79444992542267
Sub23Load3.45000004768372100.332984924316VFD21.27008724212647
UPS-1Swng0.479999989271164100Bus40.0918000042438507
VFD2Swng3.45000004768372100Bus81.27008724212647

我之前尝试的Python函数是这样的,分别查询三个字段,但结果里IDFrom会重复出现:

def Vmag(conn):
    cur = conn.cursor()
    cur.execute(r"SELECT VoltMag FROM LFR WHERE TYPE !=0 AND kV !=0;")
    rows = cur.fetchall()
    return rows

def NomkV(conn):
    cur = conn.cursor()
    cur.execute(r"SELECT kV FROM LFR WHERE TYPE !=0 AND kV !=0;")
    rows = cur.fetchall()
    return rows

def BusName(conn):
    cur = conn.cursor()
    cur.execute(r"SELECT IDFrom FROM LFR WHERE TYPE !=0 AND kV !=0;")
    rows = cur.fetchall()
    return rows

我期望得到的是三个列表,每个IDFrom只出现一次,如下所示:

预期的IDFrom列表

IDFrom
LVBus
Main Bus
Sub2A
Sub2B
Sub22
Sub23
UPS-1
VFD2

预期的kV列表

kV
0.479999989
34.5
13.80000019
13.80000019
3.450000048
3.450000048
0.479999989
3.450000048

预期的VoltMag列表

VoltMag
97.35327148
100
99.27642822
101
96.63352203
100.3329849
100
100

问题解决思路和代码优化

你的问题核心是没有对IDFrom进行去重,当前的查询会返回所有符合条件的行,但同一个IDFrom可能有多条有效数据(比如Sub23的两条Load行),所以会出现重复。

观察数据表可以发现,同一个IDFrom的有效行(Type≠0且kV≠0)中,kV和VoltMag的值是完全一致的,所以我们可以用GROUP BY IDFrom来实现去重,同时保留对应的有效值。

优化后的SQL查询

只需要一个SQL语句就能获取去重后的三个字段:

SELECT IDFrom, kV, VoltMag 
FROM LFR 
WHERE Type != 0 AND kV != 0 
GROUP BY IDFrom;

整合后的Python函数

我们可以把三个查询合并成一个函数,一次性获取所有数据再拆分成三个列表,这样更高效:

def get_unique_bus_data(conn):
    cur = conn.cursor()
    # 执行去重查询,确保每个IDFrom只返回一条有效数据
    cur.execute("""
        SELECT IDFrom, kV, VoltMag 
        FROM LFR 
        WHERE Type != 0 AND kV != 0 
        GROUP BY IDFrom
    """)
    rows = cur.fetchall()
    # 将查询结果拆分为三个独立的列表
    bus_names = [row[0] for row in rows]
    kV_values = [row[1] for row in rows]
    volt_mag_values = [row[2] for row in rows]
    return bus_names, kV_values, volt_mag_values

使用示例

在你的代码中可以这样调用这个函数:

# 假设conn是已经建立好的SQLite数据库连接
bus_names, kV_values, volt_mag_values = get_unique_bus_data(conn)

# 可以打印结果验证是否符合预期
print("唯一IDFrom列表:", bus_names)
print("对应的kV值列表:", kV_values)
print("对应的VoltMag值列表:", volt_mag_values)

这样得到的结果就完全符合你的预期了,每个IDFrom只出现一次,同时对应正确的kV和VoltMag值。


备注:内容来源于stack exchange,提问作者El-VeRdUgO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:29:32