SQL:计数和子查询

2024-04-24

再次使用 count 和 sql

在 sqlite 上,我有表格

  • 论文:paper_id、doi、年份
  • 作者:paper_id、author_id、inst_id
  • 作者:作者 ID、姓名、名字
  • 安装:inst_id、名称、see_id

inst 是一个机构表:大学等。 writeby 中的每一行给出一篇论文、一位作者、该作者当时所属的机构。 可以有多个机构,并且每个机构都会重复一对 paper_id、author_id。 对于给定的作者,我想要一个包含 paper.doi、papers.year 的列表以及与他合作撰写论文的合作者数量。 我试过

 SELECT  papers.doi, papers.year, count(*) as c
 FROM authors 
 INNER JOIN writtenby ON authors.author_id =  writtenby.author_id
 INNER JOIN writtenby AS writtenby_1 ON writtenby.paper_id =  
 writtenby_1.paper_id
 INNER JOIN papers on  writtenby_1.paper_id = papers.paper_id 
 WHERE authors.name ='Beck' AND authors.firstname= 'H P' 
 GROUP BY papers.doi, papers.year
 ORDER BY c DESC

我遇到的问题可能是,如果我正在搜索的作者在给定论文中出现两次(因为两个机构) 计数加倍。对于给定的论文,预期结果为 2890,由以下行数给出

SELECT DISTINCT author_id
FROM writtenby 
WHERE paper_id = 4593 

(我的数据:2890行) 如果没有 unique,我将有 3023 行,上面的第一个查询给出的计数为 6046。我尝试在上面的 Count 子句中使用 DISTINCT,但这仍然不起作用。

我可以将 count 与子查询一起使用吗?谢谢你的帮助...

样本数据:

-- Make the tables

CREATE TABLE 'authors' (name collate nocase, firstname collate nocase, see_id integer, 'author_id' INTEGER PRIMARY KEY NOT NULL );
CREATE TABLE 'inst' ('name' TEXT NOT NULL, 'country' TEXT NOT NULL , 'see_id' INTEGER, 'inst_id' INTEGER PRIMARY KEY NOT NULL );
CREATE TABLE 'papers' ('doi' TEXT NOT NULL,'year' TEXT NOT NULL, 'paper_id' INTEGER PRIMARY KEY NOT NULL );
CREATE TABLE 'writtenby' ('paper_id' INTEGER NOT NULL, 'author_id' INTEGER NOT NULL, 'inst_id' INTEGER NOT NULL, PRIMARY KEY ('paper_id', 'author_id', 'inst_id'));

-- Insert the data 

-- authors : 5 names, one with 2 variants

INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Doe', 'J', 1, 1);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Klein', 'K', 2, 2);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Lang', 'F', 3, 3);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Rue', 'A De La', 6, 4);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('La Rue', 'A De', 6, 5);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('De La Rue', 'A', 6, 6);
INSERT INTO 'authors' (name, firstname, see_id, author_id) VALUES ('Smith', 'S', 7, 7);

-- inst 4 name, 2 variants

INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Universite de Paris', 'France', 1, 1);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Paris University', 'France', 1, 2);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Universite de Lyon', 'France', 3, 3);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Univ Freiburg', 'Germany', 4, 4);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('EPFZ', 'Switzerland', 5, 5);
INSERT INTO 'inst' (name, country, see_id, inst_id) VALUES ('Eidg Techn Hochschule', 'Switzerland', 5, 6);

-- papers: 3 papers

INSERT INTO 'papers' (doi, year, paper_id) VALUES ('doi1', '2017', 1);
INSERT INTO 'papers' (doi, year, paper_id) VALUES ('doi2', '2018', 2);
INSERT INTO 'papers' (doi, year, paper_id) VALUES ('doi3', '2018', 3);

-- paper 1: 4 authors

INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (1, 6, 1);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (1, 6, 3);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (1, 1, 5);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (1, 2, 4);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (1, 7, 1);

-- paper 2: 3 authors

INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (2, 6, 1);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (2, 6, 3);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (2, 1, 5);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (2, 2, 5);

-- paper 3: 3 authors

INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (3, 6, 1);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (3, 2, 4);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (3, 6, 3);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (3, 2, 1);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (3, 3, 4);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (3, 3, 5);
INSERT INTO 'writtenby' (paper_id, author_id,  inst_id) VALUES (3, 3, 1);

检查查询:

 SELECT  papers.doi, papers.year, count(*) as c
 FROM authors 
 INNER JOIN writtenby ON authors.author_id =  writtenby.author_id
 INNER JOIN writtenby AS writtenby_1 ON writtenby.paper_id =  
 writtenby_1.paper_id
 INNER JOIN papers on  writtenby_1.paper_id = papers.paper_id 
 WHERE authors.name ='De La Rue' AND authors.firstname= 'A' 
 GROUP BY papers.doi, papers.year
 ORDER BY c DESC


SELECT p.doi, p.year, COUNT(w2.author_id) AS cnt
FROM authors a
INNER JOIN writtenby w1
    ON a.author_id =  w1.author_id
INNER JOIN writtenby w2
    ON w1.paper_id = w2.paper_id AND w1.author_id <> w2.author_id
INNER JOIN papers p
    ON w2.paper_id = p.paper_id 
WHERE
    a.name = 'De La Rue' AND a.firstname = 'A'
GROUP BY
    p.doi, p.year
ORDER BY
    cnt DESC;

两个查询都给出错误的结果 第一:

doi3|2018|14
doi1|2017|10
doi2|2018|8

第二次查询

doi3|2018|10
doi1|2017|6
doi2|2018|4

François


我发现正在发生的一个计数问题是您的自连接writtenby桌子。在那里,您没有检查匹配的行是否有不同的 author_id。如果author_id是一样的,那么你就不应该计算它。另外,您应该计算的共享作者数量是第二个writtenby桌子。这样,如果给定作者没有任何共同作者,计数将显示为零。

SELECT p.doi, p.year, COUNT(w2.author_id) AS cnt
FROM authors a
INNER JOIN writtenby w1
    ON a.author_id =  w1.author_id
INNER JOIN writtenby w2
    ON w1.paper_id = w2.paper_id AND w1.author_id <> w2.author_id
INNER JOIN papers p
    ON w2.paper_id = p.paper_id 
WHERE
    a.name = 'Beck' AND a.firstname = 'H P'
GROUP BY
    p.doi, p.year
ORDER BY
    cnt DESC;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL:计数和子查询 的相关文章

随机推荐

  • System.Web.Security.FormsAuthentication.Encrypt 返回 null

    我正在尝试加密一些 userData 以使用 Forms 身份验证创建我自己的自定义 IPrincipal 和 IIdentity 对象 我已将代表我登录用户的对象序列化为 Json 并创建了我的 FormsAuthentication 票
  • C++:用 istream 包装 vector

    我想包一个vector
  • Eclipse 中的默认导入

    有没有办法自定义 Eclipse 中的默认导入 例如 如果我默认打开一个新的 JUnit 测试类 我会得到以下导入 import static org junit Assert import org junit Test 我想得到什么 im
  • 无法创建“匿名类型”类型的常量值。此上下文中仅支持基本类型或枚举类型

    我对linq和实体框架 我正在尝试解决以下问题为何不起作用的问题 产生的错误是 无法创建 匿名类型 类型的常量值 在此上下文中仅支持原始类型或枚举类型 我已经尝试了很多不同的方法 但仍然收到与原始类型相关的错误 如果有人能看一下下面的代码并
  • 如何让 Maven 发出有关传递依赖版本不匹配的警告?

    在下面的 Maven 依赖项示例中 slf4j 依赖项想要引入 log4j 1 2 17 log4j 显式依赖项想要引入 1 2 15 Maven 将 log4j 解析为版本 1 2 15 但是 Maven 没有打印出 sl4j 需要更高版
  • 通过动画将视图的可见性从消失变为可见

    我有一个观点是invisible默认情况下 只是第一次 现在我需要将可见性切换为VISIBLE有了这个animation if myView getVisibility View INVISIBLE myView setVisibility
  • Http 请求的加载指示器

    我的问题的根源是在 http 请求上显示加载指示器 我想在服务级别上执行此操作 而不必为每个组件编写代码 我所做的是实现一个 http 包装器 它基本上执行以下操作 getMyHttpObservable setLoadingIndicat
  • 具有 Azure Key Vault 的本地 ASP.NET Framework Web 应用程序

    我们正在尝试保护内部 ASP NET Framework Web 应用程序中的应用程序机密 向我提供的最初计划是使用 Azure Key Vault 我开始使用我的 Visual Studio Enterprise 订阅进行开发工作 并且在
  • Laravel,获取当前登录的用户

    我想在应用程序中显示当前登录用户的列表 我想使用 Laravel Auth 方法 我正在查看 API 但找不到类似的东西 我可能需要循环访问会话存储 然后将其与用户 ID 匹配 我对吗 更新 忘了提及 我将会话存储在数据库中 当前登录 是普
  • 为字符串数组分配内存

    我想使用两个函数填充一个字符串数组 第一个 如果我有n个字符串要分配 将分配n个内存空间 第二个将为每个读取的字符串分配内存 这是第一个函数 char allocate int n char t t char malloc n sizeof
  • 数据透视表:检测数据透视字段何时折叠

    对于数据透视表中显示的数据 我选择对数据表的某些部分应用条件格式以突出显示某些范围内的值 弄清楚如何以不同于小计数据的方式突出显示第二级行数据很有趣 但我能够解决它 我的 VBA 使用以下命令触发Worksheet PivotTableUp
  • Google / OAuth 2 - 自动登录

    我正在尝试结合一些 Google API 来使用 OAuth 2 0 虽然授权过程非常简单 但在初始授权完成后 我遇到了自动授权的问题 So 1 Authorization is done for the first time user g
  • Tomcat 是否立即支持 JAX-RS(它是否支持 JAX-RS)?

    从教材 RESTful Java with JAX RS 中我们可以读到 如果我们的应用程序服务器是 JAX RS 感知的 或者换句话说 与 JAX RS 紧密集成 则声明我们的ShoppingApplication作为 servlet 的
  • iOS/WKWebView 上 SVG 的随机故障渲染

    在我们的 iOS 应用程序中显示 SVG 图标时 我们遇到了奇怪的间歇性 非常偶然 渲染故障 基于WKWebView 当它确实发生时 它似乎可能与 CSS 相关 因为如果我在调试页面时在 Safari 中更改一些随机 甚至完全不相关 的 C
  • 电脑重启后Eclipse无法启动

    我的 Eclipse 没有启动 因为我的计算机有点冻结 所以我不得不强制重新启动它 当我不得不重新启动时 Eclipse 已打开 我相信这很可能是原因 我不知道如何解决这个问题 每当我尝试打开它时 它都会告诉我检查工作区中的 log 文件
  • PHP 根据值列计算文本文件的行数

    继续我之前的question https stackoverflow com questions 52397274 php count text file rows based on date and time 我有名为拒绝的文本日志文件
  • 在 pgAdmin 中创建 ER 图 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 请提供有关如何使用附带的管理工具构建基本实体关系图 ERD 的分步答案 postgres pgAdmi
  • Seaborn 热图引发意外错误

    我正在尝试执行以下代码 import seaborn as sns import pandas as pd import numpy as np year range 1949 1961 month January February Mar
  • 将小数转换为尽可能小的数字类型,而不会丢失任何数据

    我想写一个方法来转换decimal尽可能最小的数字类型 而不会丢失任何数据 举些例子 Convert 1 应该返回一个byte Convert 257 应该返回一个short Convert 1 1 应该返回一个float 等等 该方法的输
  • SQL:计数和子查询

    再次使用 count 和 sql 在 sqlite 上 我有表格 论文 paper id doi 年份 作者 paper id author id inst id 作者 作者 ID 姓名 名字 安装 inst id 名称 see id in