SQLite与Python查询问题:获取唯一IDFrom对应的kV及VoltMag数据
SQLite与Python查询问题:获取唯一IDFrom对应的kV及VoltMag数据
我正在用SQLite搭配Python处理数据库,现在需要从一张数据表中提取唯一的IDFrom值、对应的kV和VoltMag字段,不需要其他列的信息。我尝试写了几个查询函数,但没能得到预期的唯一结果,希望能得到大家的帮助。
下面是我的数据表结构和数据:
| IDFrom | Type | kV | VoltMag | IDTo | LFMW |
|---|---|---|---|---|---|
| LVBus | Load | 0.47999999 | 97.353271484375 | Sub3 Swgr | -0.476513087749481 |
| LVBus | 0 | 0 | 0 | Bus5 | 0.123355090618134 |
| Main Bus | Swng | 34.5 | 100 | Sub2A | 3.65306186676025 |
| Main Bus | 0 | 0 | 0 | Sub2B | -1.56734025478363 |
| Main Bus | XF3W | 0 | 0 | Sub 3 | 0 |
| Sub2A | Load | 13.8000001907349 | 99.2764282226562 | Bus7 | 2.71204876899719 |
| Sub2A | 0 | 0 | 0 | Main Bus | 1.79826784133911 |
| Sub2B | Gen | 13.8000001907349 | 101 | Bus6 | 1.79826784133911 |
| Sub2B | 0 | 0 | 0 | Sub 3 | 1.6838458776474 |
| Sub2B | XF3W | 0 | 0 | Main Bus | 0 |
| Sub22 | Load | 3.45000004768372 | 96.6335220336914 | Bus7 | -2.69958877563477 |
| Sub23 | Load | 3.45000004768372 | 100.332984924316 | Bus23A | 0.524362742900848 |
| Sub23 | 0 | 0 | 0 | Bus6 | -1.79444992542267 |
| Sub23 | Load | 3.45000004768372 | 100.332984924316 | VFD2 | 1.27008724212647 |
| UPS-1 | Swng | 0.479999989271164 | 100 | Bus4 | 0.0918000042438507 |
| VFD2 | Swng | 3.45000004768372 | 100 | Bus8 | 1.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
相关产品推荐
相关产品推荐

