【问题标题】:How to conflate the value based on sharing ID using sql or python如何使用 sql 或 python 将基于共享 ID 的值混为一谈
【发布时间】:2020-12-16 05:38:54
【问题描述】:

所以,我有四个重要字段:RIVER_IDFeature_IDNameName countRIVER_ID 代表一条河流,它通常包含几个具有独特 Feature_IDs 的特征。假设河流 Danube12RIVER_ID,并且有 20 个特征,它们的 Feature_IDs 不同。这些特征中有 10 已命名,10 未命名,还有十个已命名特征中的 1 命名为 Sava,其余为命名Danube 而其余的是 NULL 值。我想将基于RIVER_ID 的特定ID 最常出现的名称混为一谈。我创建了一个简单的查询,它选择唯一命名的,但并不真正知道如何将这些值与 NULL 合并。

SELECT RIVER_ID, Name, 
Feature_ID, Name count
FROM river_names
WHERE Name! = 'NULL'
GROUP BY RIVER_ID, Name count
ORDER BY RIVER_ID, Name count;

我正在使用import sqlite3 执行此操作,并在Python3 中创建连接。我也尝试过使用.CSV 并循环遍历它,但我认为sqlite3 应该是一个更简单的解决方案。

import sqlite3

conn = sqlite3.connect('multiple_names.sqlite')

c = conn.cursor()

# print(c.execute("SELECT RIVER_ID, value, Name count FROM river_names WHERE value != 'NULL' GROUP BY RIVER_ID, Name count ORDER BY RIVER_ID, Name count DESC"))

red = []
for row in c.execute("SELECT RIVER_ID, value, Name count FROM river_names WHERE value IS NOT 'NULL' GROUP BY RIVER_ID, Name count ORDER BY RIVER_ID, Name count DESC"):
    print(row)
    red.append(row)

这就是我目前所拥有的,它会打印出(RIVER_ID、Name、Name Count)的列表。我想比较具有相同 RIVER_ID 和不同名称的功能,并将出现最多的名称附加到具有相同 RIVER_ID 的所有功能,包括没有名称的功能。

【问题讨论】:

  • 如果有帮助,您可以使用COALESCE(Name, '<unnamed>') 替换(例如)<unnamed> 为 NULL 值。
  • 另外,如果该列确实命名为"Name count",则需要在SQL 查询中引用它。

标签: python sql python-3.x list sqlite


【解决方案1】:

您可以通过聚合和窗口函数FIRST_VALUE() 获得每个RIVER_ID 出现次数最多的Name

SELECT DISTINCT
       RIVER_ID, 
       FIRST_VALUE(Name) OVER (PARTITION BY RIVER_ID ORDER BY COUNT(*) DESC) most_occuring_Name
FROM river_names
WHERE Name IS NOT NULL
GROUP BY RIVER_ID, Name 

如果您希望在查询表时返回此 Name,则将该表连接到上述查询:

SELECT r.RIVER_ID, t.most_occuring_Name Name, r.Feature_ID, r.[Name Count]
FROM river_names r LEFT JOIN (
    SELECT DISTINCT
           RIVER_ID, 
           FIRST_VALUE(Name) OVER (PARTITION BY RIVER_ID ORDER BY COUNT(*) DESC) most_occuring_Name
    FROM river_names
    WHERE Name IS NOT NULL
    GROUP BY RIVER_ID, Name 
) t ON t.RIVER_ID = r.RIVER_ID

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多