Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
Sqlite查询比较多次_Sql_Database_Sqlite - Fatal编程技术网

Sqlite查询比较多次

Sqlite查询比较多次,sql,database,sqlite,Sql,Database,Sqlite,我在sqlite中有以下模式: JournalArticlearticleID,标题,日志,卷,年,月 会议名称、名称、会议、年份、地点 人名、从属关系 Authorname,articleID 我正试图获得2000-2018年(含2000-2018年)每年会议论文数>=期刊论文数的所有作者的姓名。如果一个作者在一年内每个类别中有0篇文章,那么这个条件仍然成立。唯一重要的年份是2000-2018年 如果是多年的话,查询会容易得多,因为我可以数一数期刊文章和会议文章,并进行比较,然后得到名称。然而

我在sqlite中有以下模式:

JournalArticlearticleID,标题,日志,卷,年,月 会议名称、名称、会议、年份、地点 人名、从属关系 Authorname,articleID 我正试图获得2000-2018年(含2000-2018年)每年会议论文数>=期刊论文数的所有作者的姓名。如果一个作者在一年内每个类别中有0篇文章,那么这个条件仍然成立。唯一重要的年份是2000-2018年

如果是多年的话,查询会容易得多,因为我可以数一数期刊文章和会议文章,并进行比较,然后得到名称。然而,我在2000-2018年的每一年检查时都被卡住了

我当然不想这么多年来重复询问。我觉得我可能需要按年分组,但我不确定。到目前为止,我已经能够将2000-2018年的所有这两种类型的文章作为一个大表格,但我不确定下一步该怎么办:


嗯,让我们从每个作者和年份的计数开始:

select a.name, year, sum(is_journal), sum(is_conference)
from ((select ja.article_id, ja.year, 1 as is_journal, 0 as is_conference
       from journalarticle ja
      ) union all
      (select ca.article_id, ca.year, 0 as is_journal, 1 as is_conference
       from conferencearticle ca
      ) 
     ) jc join
     authors a
     on a.article_id = jc.article_id
group by a.name, jc.year
现在,您可以再次聚合以匹配符合条件的年份:

select ay.name
from (select a.name, year, sum(is_journal) as num_journal, sum(is_conference) as num_conference
      from ((select ja.article_id, ja.year, 1 as is_journal, 0 as is_conference
             from journalarticle ja
            ) union all
            (select ca.article_id, ca.year, 0 as is_journal, 1 as is_conference
             from conferencearticle ca
            ) 
           ) jc join
           authors a
           on a.article_id = jc.article_id
      group by a.name, jc.year
     ) ay
where (jc.year >= 2000 and jc.year <= 2018) and
      num_journal >= num_conference
group by ay.name;

听起来你可以在小组中通过

SELECT a.name, 
COALESCE(j.year, c.year) as "year",
COUNT(j.articleID) AS JournalArticles,
COUNT(c.articleID) AS ConferenceArticles
FROM Author a
LEFT JOIN JournalArticle j ON (j.articleID = a.articleID AND j.year BETWEEN 2000 AND 2018)
LEFT JOIN ConferenceArticle c ON (c.articleID = a.articleID AND c.year BETWEEN 2000 AND 2018)
WHERE (j.year IS NOT NULL OR c.year IS NOT NULL)
GROUP BY a.name, COALESCE(j.year, c.year)
HAVING COUNT(c.articleID) >= COUNT(j.articleID)

请添加您的查询您是否还可以指定您正在使用的RDBMS添加一些示例表数据和预期结果-全部为格式化文本,而不是图像。如果一位作者在2010年之前没有任何文章,但从2010年起每年的会议文章多于期刊文章,应该怎么办?或者,如果他们有一年没有任何文章的中间,应该发生什么?你真的只通过名字来识别人吗?无PersonID???作者表的主键为name,articleID和articleID不能为空。如果他们在某一年内没有任何物品0>=0,则条件仍然成立。唯一重要的年份是2010-2018年,因此如果会议文章>=这些年份的期刊文章,则条件成立。OP已确认,由于规则是“大于或等于”,没有任何类型文章的年份不应导致作者被排除在外。@MatBailie。这实际上更简单。不需要有任何条款。除了作者在任何年份没有文章;虽然在这种情况下,OP可能需要考虑业务需求,但在更改为外部联接之前。@ MatBailie按值计数不计算NULL。所以应该没问题。还有克劳德。
SELECT a.name, 
COALESCE(j.year, c.year) as "year",
COUNT(j.articleID) AS JournalArticles,
COUNT(c.articleID) AS ConferenceArticles
FROM Author a
LEFT JOIN JournalArticle j ON (j.articleID = a.articleID AND j.year BETWEEN 2000 AND 2018)
LEFT JOIN ConferenceArticle c ON (c.articleID = a.articleID AND c.year BETWEEN 2000 AND 2018)
WHERE (j.year IS NOT NULL OR c.year IS NOT NULL)
GROUP BY a.name, COALESCE(j.year, c.year)
HAVING COUNT(c.articleID) >= COUNT(j.articleID)