SQL 如何实现每三个分一组

 

数据表EMPLOYEE是员工数据,部分数据如下:

EID

NAME

GENDER

STATE

HIREDATE

SALARY

1

Rebecca

F

California

2005/3/11

7000

2

Ashley

F

New York

2008/3/16

11000

3

Rachel

F

New Mexico

2010/12/1

9000

4

Emily

F

Texas

2006/8/15

7000

5

Ashley

F

Texas

2004/7/30

16000

需要根据员工的入职时间每三条员工记录分一组,统计每组的平均工资。

 

将员工按照入职时间的顺序,每取三条员工记录分为一组。最后统计每组的平均工资。

ORACLESQL

SELECT GROUP_NO, avg(SALARY) AS AVG_SALARY

FROM (

            SELECT TRUNC((rn - 1) / 3) + 1 AS GROUP_NO

                        , SALARY

            FROM (

                        SELECT SALARY, ROW_NUMBER() OVER (ORDER BY HIREDATE) AS rn

                        FROM EMPLOYEE

            )

)

GROUP BY GROUP_NO

ORDER BY GROUP_NO

 

解这道题其实很简单,就是需要依次将n条记录分成一组。比如:【记录1、记录2、记录3】是第一组,【记录4、记录5、记录6】是第二组,以此类推,规律在于当前记录是“记录几”,用这个数字除以3取整的结果值就是分组的依据。但是SQL 没有天然的 “序号”,需要繁琐的办法人为造出来。然后才能利用它去完成以上自然思维下干的事。

 

用开源集算器的SPL就很容易写:


A

1

=connect("ORACLE").query@x("SELECT * FROM EMPLOYEE ORDER BY HIREDATE")

2

=A1.group@n(((#-1)\3)+1).new(#:GROUP_NO,~.avg(SALARY):AVG_SALARY)

SPL可以直接用#表示序号,很容易实现按序号的运算结果分组。