在Python的SQLite3中,如何使用GROUPBY计算不为空的行?
我正在使用Python 3.6中的标准SQLite3。我想计算每个组中有多少行的列表项不是空的。Empty表示空字符串或NULL 我目前与:在Python的SQLite3中,如何使用GROUPBY计算不为空的行?,python,sqlite,group-by,Python,Sqlite,Group By,我正在使用Python 3.6中的标准SQLite3。我想计算每个组中有多少行的列表项不是空的。Empty表示空字符串或NULL 我目前与: SELECT group_num, count(list_num) FROM pair_candidates WHERE list_num IS NOT NULL GROUP BY group_num 这会计算有多少行具有相同的组编号,但不幸的是,它不会告诉我这些行中有多少行的列表编号不是空的 我尝试在GROUPBY子句之前添加WHERE list
SELECT group_num, count(list_num)
FROM pair_candidates WHERE list_num IS NOT NULL
GROUP BY group_num
这会计算有多少行具有相同的组编号,但不幸的是,它不会告诉我这些行中有多少行的列表编号不是空的
我尝试在GROUPBY子句之前添加WHERE list_num NOTNULL,但没有帮助。在GROUP BY之后尝试使list_num不为NULL也没有帮助
我需要做什么才能得到我的计数
例如:
group_num | list_num
----------+---------
1 |
1 | 1
2 | 1
2 | 1
3 | ""
3 |
我想去
group_num | count
----------+------
1 | 1
2 | 2
3 | 0
选择列表数量不等于空字符串的行。由于与NULL的比较产生未知结果,因此这些行也将被丢弃:
SELECT group_num, COUNT(*)
FROM pair_candidates
WHERE list_num != ''
GROUP BY group_num
但这不会为没有与条件匹配的行的group_num生成结果,因此结果并不是您希望的结果。为了生成空组的计数,您可以使用以下事实:返回组中X不为NULL的次数
SELECT group_num, COUNT(NULLIF(list_num, ''))
FROM pair_candidates
GROUP BY group_num
如果参数不同,则返回其第一个参数;如果参数相同,则返回NULL;因此,如果X为,则COUNTNULLIFX不计算
一个完整的例子:
In [1]: from contextlib import closing
In [2]: import sqlite3
In [3]: conn = sqlite3.connect(':memory:')
In [4]: with closing(conn.cursor()) as cur:
...: cur.execute('create table pair_candidates (group_num, list_num)')
...: cur.executemany('insert into pair_candidates values (?, ?)', [
...: (1, None), (1, 1), (2, 1), (2, 1), (3, ""), (3, None)])
...:
In [5]: with closing(conn.cursor()) as cur:
...: cur.execute('''select group_num, count(nullif(list_num, ''))
...: from pair_candidates
...: group by group_num''')
...: res = cur.fetchall()
...:
In [6]: res
Out[6]: [(1, 1), (2, 2), (3, 0)]
选择列表数量不等于空字符串的行。由于与NULL的比较产生未知结果,因此这些行也将被丢弃:
SELECT group_num, COUNT(*)
FROM pair_candidates
WHERE list_num != ''
GROUP BY group_num
但这不会为没有与条件匹配的行的group_num生成结果,因此结果并不是您希望的结果。为了生成空组的计数,您可以使用以下事实:返回组中X不为NULL的次数
SELECT group_num, COUNT(NULLIF(list_num, ''))
FROM pair_candidates
GROUP BY group_num
如果参数不同,则返回其第一个参数;如果参数相同,则返回NULL;因此,如果X为,则COUNTNULLIFX不计算
一个完整的例子:
In [1]: from contextlib import closing
In [2]: import sqlite3
In [3]: conn = sqlite3.connect(':memory:')
In [4]: with closing(conn.cursor()) as cur:
...: cur.execute('create table pair_candidates (group_num, list_num)')
...: cur.executemany('insert into pair_candidates values (?, ?)', [
...: (1, None), (1, 1), (2, 1), (2, 1), (3, ""), (3, None)])
...:
In [5]: with closing(conn.cursor()) as cur:
...: cur.execute('''select group_num, count(nullif(list_num, ''))
...: from pair_candidates
...: group by group_num''')
...: res = cur.fetchall()
...:
In [6]: res
Out[6]: [(1, 1), (2, 2), (3, 0)]
好吧,您不能简单地从SQL查询中获取它。NULL是一种特殊的动物,它只能被is NULL捕获,并且绝对不同于。但这并不是全部:SELECT COUNT GROUP BY将永远不会返回一个以0作为计数的行,而只是不返回该组的任何行。毕竟,该组的查询没有返回任何行,count只是返回行的聚合 当然可以使用外部联接强制生成一行,但除非您真正精通SQL,否则它肯定会相当复杂。但是混合使用Python代码中的两个查询很简单:第一个返回组列表并将计数初始化为0,第二个返回非零计数并可用于更新初始映射 假设con是到Sqlite3数据库的活动连接,则可以执行以下操作:
groups = { x[0]: 0 for x in con.execute(
"SELECT distinct group_num FROM pair_candidates").fetchall() }
groups.update({ x[0]: x[1] for x in con.execute(
"""SELECT group_num, count(list_num)
FROM pair_candidates WHERE list_num != ""
GROUP BY group_num""").fetchall() })
print(groups)
这将如预期的那样返回:
{1: 1, 2: 2, 3: 0}
好吧,您不能简单地从SQL查询中获取它。NULL是一种特殊的动物,它只能被is NULL捕获,并且绝对不同于。但这并不是全部:SELECT COUNT GROUP BY将永远不会返回一个以0作为计数的行,而只是不返回该组的任何行。毕竟,该组的查询没有返回任何行,count只是返回行的聚合 当然可以使用外部联接强制生成一行,但除非您真正精通SQL,否则它肯定会相当复杂。但是混合使用Python代码中的两个查询很简单:第一个返回组列表并将计数初始化为0,第二个返回非零计数并可用于更新初始映射 假设con是到Sqlite3数据库的活动连接,则可以执行以下操作:
groups = { x[0]: 0 for x in con.execute(
"SELECT distinct group_num FROM pair_candidates").fetchall() }
groups.update({ x[0]: x[1] for x in con.execute(
"""SELECT group_num, count(list_num)
FROM pair_candidates WHERE list_num != ""
GROUP BY group_num""").fetchall() })
print(groups)
这将如预期的那样返回:
{1: 1, 2: 2, 3: 0}
从Select*中选择group_num,countlist_num,从list_num不为空的候选对中选择group_num,countlist_num如何?从list_num不为空的候选对中选择group_num,countlist_num,从Select*中选择group_num,countlist_num?