Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python的SQLite3中,如何使用GROUPBY计算不为空的行?_Python_Sqlite_Group By - Fatal编程技术网

在Python的SQLite3中,如何使用GROUPBY计算不为空的行?

在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

我正在使用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_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?