sql - 在GROUP BY c之后如何计算(DISTINCT a,b)

标签 sql sqlite group-by count

我有一个由三列组成的表:newspaperpersonpage
一个人可以多次阅读一个页面,这意味着我们可能会有一个这样的表:

newspaper   person  page
---------   ------  ----
NY Times      A      1
NY Times      A      1
NY Times      A      1
NY Times      A      2
NY Times      B      8
NY Times      B      9
NY Times      B      9
WashPost      A      1
WashPost      B      1


我想为每份报纸(= COUNTGROUP BY newspaper,某人阅读一页的次数。为了弄清楚我的意思,对于上面的输入表,结果必须类似于:

newspaper     COUNT
---------   --------
NY Times        4   =>  (A,1) (A,2) (B,8) (B,9)
WashPost        2   =>  (A,1) (B,1)


我的第一次尝试是下面的查询,sqlite不允许这样做,但可以弄清楚我需要什么:

SELECT newspaper, COUNT(DISTINCT person, page)
FROM T 
GROUP BY newspaper




作为一种解决方法,我可以使用person连接page||列,并且查询可以正常工作,但是我正在考虑一个更好的解决方案。

SELECT newspaper, COUNT(DISTINCT person || page)
FROM T 
GROUP BY newspaper

最佳答案

您需要的是distinct消除重复,然后为每份报纸删除count(*)行。为此,我们使用子查询:

select newspaper, count(*) as reads_no
from (
  select distinct newspaper, person, page
  from t
) t
group by newspaper


您不应该连接两个字段并对其进行区分,因为除非与某些疯狂的定界符一起使用,否则您可能会丢弃一些值,除非您知道这些疯狂的定界符在字段中将永远不存在。请参见以下示例。

'aab' || 'xzy' = 'aa' || 'bxzy'

关于sql - 在GROUP BY c之后如何计算(DISTINCT a,b),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51078819/

相关文章:

database - 如何在 Mac OS X 上从命令行启动 sqlite 数据库浏览器

java - 在 Android 中使用 Java 插入 FOR 循环内的 SQLITE TABLE 得到 NPE 错误?

mysql - 在 MYSQL 中用于分组依据的不同列的其他值中选择值

mysql - GROUP BY 也选择非常量列

javascript - 使用 lodash 进行多级分组

php - MySQL,如何获取后缀最高的字符串

mysql - SELECT CASE 问题

sql - MySQL记录存在性优化

c++ - 使用目录中的文件名填充数据库

python - 在 Python 中打开一个压缩的 SQLite 数据库