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 / (

                                    SELECT count(*)

                                    FROM EMPLOYEE

                        )) + 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

 

解这道题其实很简单,依次计算出当前记录在所有记录中的位置,按位置把数据分组即可。关键在于要算位置,就需要先知道当前记录是“第几条记录”,才能算出记录所在的位置。但是SQL 没有天然的 “序号”,需要繁琐的办法人为造出来。然后才能利用它去算记录的位置。

 

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


A

1

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

2

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

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