java - 如何计算具有特定值和特定用户/人(行中)的数据?

标签 java sql postgresql count

我有一个问题,我无法处理...

我的 PostgreSQL 表如下所示:

id student grade class gradeDate
1     1      5     1       2017-03-03
2     1      5     1       2017-03-04
3     1      1     1       2017-03-05
4     1      5     1       2017-03-06
5     1      5     1       2017-03-07
6     1      5     1       2017-03-08
7     1      1     1       2017-03-09
8     2      5     2       2017-03-03
9     3      5     3       2017-03-03

所以我在不同的类(class) (1,2,3,4...) 有不同的学生 (1,2,3...),他们每天都获得成绩 (gradeDate) - 它只能是 5 或 1 - 现在我想从这个数据库中为每个学生选择连续 5 年级的最大数量(连续我的意思是每天不休息的 5 年级) 因此,在上表中,用户 1 的最大计数为 3(第 4、5、6 行),用户 2 的最大计数为 1,用户 3 的最大计数为 1。 如果我将第 3 行的成绩更改为 5,则学生 1 的最大计数将为 6 你明白了吗?

起初我想以某种方式使用 SELECT 查询,但首先 - 我不知道如何进行此查询,其次 - 当此中将有数千或数百万行时 表,那查询的效率会非常非常低。 我通常可以获取学生 1 的每一行并用 Java 对其进行操作。 所以我问 - 我该如何解决这个问题? 感谢您的时间和精力。

最佳答案

您需要确定相邻的组。一种简单的方法是行号的差异。要真正理解它,您需要运行子查询并查看结果。您应该“看到”差异如何定义组。

select student, class, grade, count(*), min(gradeDate), max(gradeDate)
from (select t.*,
             row_number() over (partition by student, class, grade order by gradeDate) as seqnum_scg,
             row_number() over (partition by student, class order by gradeDate) as seqnum_sc
      from t
     ) t
group by student, class, grade, (seqnum_sc - seqnum_scg);

要获得最大值,您可以使用 distinct on。我将为此使用子查询:

select distinct on (student, class) scg.*
from (select student, class, grade, count(*) as cnt,
             min(gradeDate), max(gradeDate), min_gradeDate, max_gradeDate
      from (select t.*,
                   row_number() over (partition by student, class, grade order by gradeDate) as seqnum_scg,
                   row_number() over (partition by student, class order by gradeDate) as seqnum_sc
            from t
           ) t
      where grade = 5
      group by student, class, grade, (seqnum_sc - seqnum_scg)
     ) scg
order by student, class, cnt desc;

关于java - 如何计算具有特定值和特定用户/人(行中)的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46245647/

相关文章:

sql - plpy.notice(msg) 是做什么的?

java - 面向对象数据库难题?

java - 从单独的类(初学者)启动 JPanel

sql - 标签中值出现的次数

mysql - 根据邮政编码和它在 MySQL 中的半径选择记录

django - 数据仓库和 Django

django - pip install dj-database-url 给出了权限被拒绝的错误

java - 用于 java 的领英

java - 重置游戏以在 Java 中重新开始

sqlplus 从所选结果中选择