在python中使用sqlite3计算跨列的非重复值

6ss1mwsb  于 2023-03-13  发布在  SQLite
关注(0)|答案(4)|浏览(186)

我尝试在python中使用sqlite3计算不同列的非重复值,但似乎无法得到正确的结果。我只能得到1列中非重复值的计数。
我创建了一个数据库,并将csv文件作为表导入

conn = sqlite3.connect('test.db')
curr = conn.cursor()

curr.execute('DROP TABLE IF EXISTS test')
curr.execute('CREATE TABLE social_table (from_id INTEGER, to_id INTEGER)')
conn.commit()

with open ('test.csv') as f:
    reader = csv.reader(f)
    next(reader, None)

    for row in reader:
        from_id = row[0]
        to_id = row[1]

        curr.execute('INSERT INTO test (from_id, to_id) VALUES (?, ?)',
                    (from_id, to_id))
    conn.commit()

| 发件人ID|目标标识符|
| - ------|- ------|
| 无|1个|
| 无|第二章|
| 无|三个|
| 无|四个|
| 无|五个|
| 无|六个|
| 无|七|
| 无|八个|
| 无|十个|
| 无|十一|
此表中跨列的唯一用户应为11,但我的代码

curr.execute("Select Count(*) from (Select DISTINCT from_id, to_id from test)")

给了我10块。
有人能帮我吗?

vsaztqbk

vsaztqbk1#

似乎您的查询不正确,请尝试以下操作:

curr.execute("""
    SELECT COUNT(DISTINCT user_id) 
    FROM (
        SELECT from_id as user_id FROM social_table 
        UNION 
        SELECT to_id as user_id FROM social_table
    )
""")

只需选择from_id的所有非重复值,然后将它们与to_id的所有非重复值进行并集,然后计算并集中非重复值的数量,这样就可以给予两列中唯一用户的总数。

fxnxkyjh

fxnxkyjh2#

您应该同时计算from_idto_id列中的非重复用户。我们可以使用联合来实现此目的:

SELECT COUNT(DISTINCT id) AS cnt
FROM
(
    SELECT from_id AS id FROM social_table
    UNION ALL
    SELECT to_id FROM social_table
) t;
0tdrvxhp

0tdrvxhp3#

另一个想法是将列连接为字符串

from_id || '-' || to_id

因此,您的查询将是

curr.execute("Select Count(*) from (Select DISTINCT from_id || '-' || to_id  from social_table)")
iyr7buue

iyr7buue4#

我认为from_idto_id不应该为空,因此应该将表定义更正为:

CREATE TABLE social_table (from_id INTEGER NOT NULL, to_id INTEGER NOT NULL);

在这种情况下,您应该使用简单的COUNT(*),而不是效率较低的COUNT(DISTINCT ...)

sql = """
    SELECT COUNT(*) AS count 
    FROM (
      SELECT from_id FROM social_table 
      UNION 
      SELECT to_id FROM social_table
    )
"""
curr.execute(sql)

因为UNION从结果集中删除了重复项。
请参见demo

相关问题