Cassandra MAX函数返回不匹配的行

pqwbnv8z  于 2022-11-05  发布在  Cassandra
关注(0)|答案(1)|浏览(152)

嗨,我试图从Cassandra中的表获取最大合著者发布,但是当我查询select coauthor_name, MAX(num_of_colab) AS max_2020 from coauthor_by_author where pid = '40/2499' and year=2020;时,它返回了不匹配的行。
它会传回:

这是错误的,因为9属于另一个合著者。
下面是我为表创建的语句:

CREATE TABLE IF NOT EXISTS coauthor_by_author (
        pid text,
        year int,
        coauthor_name text,
        num_of_colab int,
        PRIMARY KEY ((pid), year, coauthor_name, num_of_colab)
    ) WITH CLUSTERING ORDER BY (year desc);

作为证明,这里是原始表格的一部分:

如您所见,Abdul Hanif Bin Zaini作为合著者发表文章数量应该只有1篇

envsm3lx

envsm3lx1#

MAX()函数正如广告中所宣传的那样工作,但我认为你对它如何工作的理解是不正确的。让我用一个例子来说明。
下面是作者表的模式:

CREATE TABLE authors_by_coauthor (
    author text,
    coauthor text,
    colabs int,
    PRIMARY KEY (author, coauthor)
)

以下是作者、合作作者以及合作次数的样本数据:

author  | coauthor  | colabs
---------+-----------+--------
    edda | ramakanta |      5
    edda |    ruzica |      9
   anita |   dakarai |      8
   anita |    sophus |     12
   anita |      uche |      4
 cassius |    ceadda |     14
 cassius |  flaithri |     13

Anita有三位合著者:

cqlsh> SELECT * FROM authors_by_coauthor WHERE author = 'anita';

 author | coauthor | colabs
--------+----------+--------
  anita |  dakarai |      8
  anita |   sophus |     12
  anita |     uche |      4

Anita的最高合作次数是12

SELECT MAX(colabs) FROM authors_by_coauthor WHERE author = 'anita';

 system.max(colabs)
--------------------
                 12

同样,卡修斯也有两位合著者:

cqlsh> SELECT * FROM authors_by_coauthor WHERE author = 'cassius';

 author  | coauthor | colabs
---------+----------+--------
 cassius |   ceadda |     14
 cassius | flaithri |     13

其中14是最多的协作:

cqlsh> > SELECT MAX(colabs) FROM authors_by_coauthor WHERE author = 'cassius';

 system.max(colabs)
--------------------
                 14

您的问题不完整,因为您没有提供完整的示例数据,但我怀疑您希望获得合作最多的合著者的姓名。此CQL查询将不会返回您所需的结果:

SELECT coauthor_name, MAX(num_of_colab)
  FROM coauthor_by_author
  WHERE ...

SELECT coauthor_name, MAX(num_of_colab)中,您错误地假设MAX(num_of_colab)的结果对应于coauthor_name。聚合函数只返回一行,因此结果集只包含一个合著者。合著者Abdul ...恰好是结果中的第一行,因此与MAX()输出一起列出。
使用集合函数时,只有在SELECT语句中单独指定该函数才有意义:

SELECT function(col_name) FROM table WHERE ...

在查询选择器中指定其他列对于聚合函数没有意义。干杯!

相关问题