如何以 N 行为一组进行 GROUP BY?
How to GROUP BY in groups of N rows?
我有一个名为 PEOPLE
的 table,具有以下数据:
MYNAME AGE MYDATE
==========================
MARIO 20 2015/02/03
MARIA 10 2015/02/02
PEDRO 40 2015/02/01
JUAN 15 2015/01/03
PEPE 20 2015/01/02
JULIA 30 2015/01/01
JUANI 50 2014/02/03
MARTIN 10 2014/02/03
NASH 21 2014/02/03
然后我想获得按 MYDATE
降序排列的 3 人一组的平均年龄。
我的意思是,我正在寻找的结果类似于:
23,3
21,6
27
其中 23,3
是年龄的平均值:
MARIO 20 2015/02/03
MARIA 10 2015/02/02
PEDRO 40 2015/02/01
而21,6
是以下年龄的平均值:
JUAN 15 2015/01/03
PEPE 20 2015/01/02
JULIA 30 2015/01/01
而27
是以下年龄的平均值:
JUANI 50 2014/02/03
MARTIN 10 2014/02/03
NASH 21 2014/02/03
我该如何处理?我知道如何使用 GROUP BY
但只能针对 table.
的特定字段进行分组
SQL 表本质上是无序的,因此我假设您希望按 mydate
降序排列。您可以使用变量枚举行,使用算术定义组,然后取平均值:
select avg(age)
from (select t.*, (@rn := @rn + 1) as seqnum
from table t cross join
(select @rn := 0) vars
order by mydate desc
) t
group by floor((seqnum - 1) / 3);
尝试 - 然后您还可以使用 Grp 来获取平均值与哪三个人相关
select MYNAME, AGE, MYDATE, RN / 3 As Grp into #x
from
(select MYNAME, AGE , MYDATE, ROW_NUMBER() over(order by MyDate) + 2 as RN
from MYdata)x
select Grp, AVG(Age) as AvgAge
From #x
Group By Grp
我有一个名为 PEOPLE
的 table,具有以下数据:
MYNAME AGE MYDATE
==========================
MARIO 20 2015/02/03
MARIA 10 2015/02/02
PEDRO 40 2015/02/01
JUAN 15 2015/01/03
PEPE 20 2015/01/02
JULIA 30 2015/01/01
JUANI 50 2014/02/03
MARTIN 10 2014/02/03
NASH 21 2014/02/03
然后我想获得按 MYDATE
降序排列的 3 人一组的平均年龄。
我的意思是,我正在寻找的结果类似于:
23,3
21,6
27
其中 23,3
是年龄的平均值:
MARIO 20 2015/02/03
MARIA 10 2015/02/02
PEDRO 40 2015/02/01
而21,6
是以下年龄的平均值:
JUAN 15 2015/01/03
PEPE 20 2015/01/02
JULIA 30 2015/01/01
而27
是以下年龄的平均值:
JUANI 50 2014/02/03
MARTIN 10 2014/02/03
NASH 21 2014/02/03
我该如何处理?我知道如何使用 GROUP BY
但只能针对 table.
SQL 表本质上是无序的,因此我假设您希望按 mydate
降序排列。您可以使用变量枚举行,使用算术定义组,然后取平均值:
select avg(age)
from (select t.*, (@rn := @rn + 1) as seqnum
from table t cross join
(select @rn := 0) vars
order by mydate desc
) t
group by floor((seqnum - 1) / 3);
尝试 - 然后您还可以使用 Grp 来获取平均值与哪三个人相关
select MYNAME, AGE, MYDATE, RN / 3 As Grp into #x
from
(select MYNAME, AGE , MYDATE, ROW_NUMBER() over(order by MyDate) + 2 as RN
from MYdata)x
select Grp, AVG(Age) as AvgAge
From #x
Group By Grp