我有一个问题,我无法处理...
我的 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/