我尝试在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块。
有人能帮我吗?
4条答案
按热度按时间vsaztqbk1#
似乎您的查询不正确,请尝试以下操作:
只需选择
from_id
的所有非重复值,然后将它们与to_id
的所有非重复值进行并集,然后计算并集中非重复值的数量,这样就可以给予两列中唯一用户的总数。fxnxkyjh2#
您应该同时计算
from_id
和to_id
列中的非重复用户。我们可以使用联合来实现此目的:0tdrvxhp3#
另一个想法是将列连接为字符串
因此,您的查询将是
iyr7buue4#
我认为
from_id
和to_id
不应该为空,因此应该将表定义更正为:在这种情况下,您应该使用简单的
COUNT(*)
,而不是效率较低的COUNT(DISTINCT ...)
:因为
UNION
从结果集中删除了重复项。请参见demo。