为其他列的每个不同值选择列的所有最大值

时间:2020-10-11 01:02:13

标签: sqlite

我正在尝试获取给定日期网站上帖子的最常用标签列表。我目前有这个查询:

SELECT posts.pdate, tags.tag, count(posts.pid) as post_count
FROM posts, tags
WHERE posts.pid = tags.pid
GROUP BY posts.pdate, tags.tag
ORDER BY posts.pdate;

这为我提供了每个不同的标签,以及它们的使用日期以及使用它们的帖子数,并以此为我返回:

2020-09-10|CMPUT291|1
2020-09-10|computing|1
2020-09-10|database|2
2020-09-10|frequentTag1|2
2020-09-10|relational|2
2020-09-10|sql|1
2020-09-10|tieTag1|2
2020-09-11|Database|1
2020-09-11|data|1
2020-09-11|relational|1
2020-09-11|sql|1
2020-09-13|Database|1
2020-09-13|Sql language|1
2020-09-13|access|1
2020-09-13|frequentTag3|2
2020-09-13|query|3
2020-09-13|relational|3
2020-09-13|sql|1
2020-09-17|Database|1
2020-09-17|frequentTag3|3
2020-09-17|query|1
2020-09-17|relational|1
2020-09-17|sql|1
2020-09-17|sql language|1
2020-09-20|RELATIONAL|1
2020-09-20|database|1
2020-09-20|query|1
2020-09-20|sql language|1
2020-09-25|database|1
2020-09-25|sql language|1
2020-09-30|boring|2
2020-09-30|extra tag|1
2020-09-30|fun|3
2020-09-30|just here|1
2020-09-30|more tag|1
2020-09-30|sleep|3
2020-09-30|tag tag|1
2020-09-30|tag test|1
2020-09-30|test tag|1

但是,我现在需要使它只给我每个日期中具有最大行数的行(或在有平局的情况下所有行都具有最大行)。 我希望能够使用MAX(count(posts.pid)),但是我知道这行不通,所以我需要找到一个替代方法。 我应该得到一个最终结果:

2020-09-10|database|2
2020-09-10|frequentTag1|2
2020-09-10|relational|2
2020-09-10|tieTag1|2
2020-09-11|Database|1
2020-09-11|data|1
2020-09-11|relational|1
2020-09-11|sql|1
2020-09-13|query|3
2020-09-13|relational|3
2020-09-17|frequentTag3|3
2020-09-20|RELATIONAL|1
2020-09-20|database|1
2020-09-20|query|1
2020-09-20|sql language|1
2020-09-25|database|1
2020-09-25|sql language|1
2020-09-30|fun|3
2020-09-30|sleep|3

任何帮助将不胜感激。

适用模式:

create table posts (
  pid       char(4),
  pdate     date,
  title     text,
  body      text,
  poster    char(4),
  primary key (pid),
  foreign key (poster) references users
);

create table tags (
  pid       char(4),
  tag       text,
  primary key (pid,tag),
  foreign key (pid) references posts
);

1 个答案:

答案 0 :(得分:0)

您可以使用RANK()窗口功能:

SELECT pdate, tag, post_count
FROM (
  SELECT p.pdate, 
         t.tag, 
         COUNT(*) post_count,
         RANK() OVER (PARTITION BY p.pdate ORDER BY COUNT(*) DESC) rnk
  FROM posts p INNER JOIN tags t
  ON p.pid = t.pid
  GROUP BY p.pdate, t.tag
)
WHERE rnk = 1
ORDER BY pdate, tag;

您应该在JOIN子句中使用适当的ON,而不是在WHERE子句中使用过时的语法。